2017-05-06 10 views
2

の列Yの値に等しくなるように、二つの列にPostgreSQLでテーブルを注文:列Xの値は、私は、次の構造を有する、PostgreSQLのテーブルを持っている前のレコード

id  | from  | to 
----------+----------+-------- 
    11 | 18  |  123 
    3  | 88  |  6 
    23 | 33  |  18 
    7  | 123  |  88 

私はそのテーブルをソートしたいので、与えられたレコードの "from"フィールドの値は、前のレコードの "to"フィールドの値と等しくなります。注文したときに、他の言葉では、上記の例では、次のようになります。

id  | from  | to 
----------+----------+-------- 
    23 | 33  |  18 
    11 | 18  |  123 
    7  | 123  |  88 
    3  | 88  |  6 

誰かが、これはPostgreSQLので行うことができる方法を知っていますか?どうもありがとうございました。

答えて

1

再帰的なCTEを使用してこれを行うことができます。ルートとレベルを追跡します。

with recursive t (id, fr, t) as (
     values (11, 18, 123), (3, 88, 6), (23, 33, 18), (7, 123, 88) 
    ), 
    cte as (
     select t.id, t.fr, t.t, t.fr as root, 1 as lev 
     from t 
     where not exists (select 1 from t t2 where t2.t = t.fr) 
     union all 
     select t.id, t.fr, t.t, cte.root, cte.lev + 1 
     from t join 
      cte 
      on t.fr = cte.t 
    ) 
select * 
from cte 
order by cte.root, cte.lev; 

注:彼らはSQLのキーワードと競合するのでfromtoが悪い列名です以下は、あなたが何のサイクルを持っていないことを前提としています。

+0

こんにちは、実際に試してみました。私は列名として "from"と "to"を使用しませんが、これは例のためです。しかし、問題は実際には以下の例のようにサイクルがあることです。あなたはサイクルを処理できる解決策を知っていますか?事前にどうもありがとうございました。 –

+0

@IliyaMarkov。 。 。これはあなたが聞いた質問に答えます。適切なデータとサイクルの処理方法を明確に定義して、*別の質問をする必要があります。この質問を修正すると、この答えが無効になります。これは、下線を引くことができるため失礼です。 –

+0

ありがとうございます。新しい質問を投稿します。 –

関連する問題