0

私のテーブルは次のようになります。

Value     Previous     Next
37        NULL         42
42        37           3
3         42           79
79        3            NULL

ただし、テーブルがすべて故障しています。(重複がないので、問題ではありません。) 出力を順序付けするクエリを作成する方法があるかどうか疑問に思っていました。その上 ?

データベースとこのデータの保存方法を制御することはできません。私はそれを取得して整理しようとしています。SQL Server 2008年だと思います。

これを後で再編成するのは難しくないことはわかっていますが、心配する必要がないように、箱から出してすぐに実行できるクエリを作成できるかどうかに興味がありました。

4

5 に答える 5

1

を使用している場合はOracleStarts with- connect by

    select ... start with initial-condition connect by 
    nocycle recursive-condition;

編集:SQL-Serverの場合、次の構文を使用WITHします。

WITH rec(value, previous, next) AS 
  (SELECT value, previous, next 
    FROM table1
    WHERE previous is null
    UNION ALL
    SELECT nextRec.value, nextRec.previous, nextRec.next
    FROM table1 as nextRec, rec
    WHERE rec.next = nextRec.value)
  SELECT value, previous, next FROM rec;
于 2012-11-16T18:35:30.877 に答える
1

これはあなたが必要とすることをするはずです:

WITH CTE AS (
    SELECT YourTable.*, 0 Depth
    FROM YourTable
    WHERE Previous IS NULL
    UNION ALL
    SELECT YourTable.*, Depth + 1
    FROM YourTable JOIN CTE
        ON YourTable.Value = CTE.Next
)
SELECT * FROM CTE
ORDER BY Depth;

[SQL Fiddle] (簡潔にするために、参照整合性とインデックスは省略されています。)

再帰的な共通テーブル式 ( CTE) を使用して、リストの先頭 ( WHERE Previous IS NULL) から末尾のノード ( ON YourTable.Value = CTE.Next) に移動すると同時に、現在のノードに到達するために必要な再帰の深さを記憶します ( Depth)。

最後に、各ノードに到達するために必要な再帰の深さでソートするだけです ( ORDER BY Depth)。

于 2012-11-16T20:21:03.907 に答える
1

再帰クエリを使用します。ここにリストしたものを使用すると、リンクされたリストに沿って複数のパスを作成できます。

with cte (Value, Previous, Next, Level)
as
(
  select Value, Previous, Next, 0 as Level
  from data
  where Previous is null

  union all

  select d.Value, d.Previous, d.Next, Level + 1
  from data d
    inner join cte c on d.Previous = c.Value  
)

select * from cte

ここでフィドル

于 2012-11-16T18:56:09.457 に答える
0

このようなものが機能するはずです:

With Parent As (
  Select
    Value,
    Previous,
    Next
  From
    table
  Where
    Previous Is Null
  Union All
  Select
    t.Value,
    t.Previous,
    t.Next
  From
    table t
      Inner Join  
    Parent
      On Parent.Next = t.Value
)

Select
  *
From
  Parent

于 2012-11-16T18:34:51.680 に答える
0

これを行う1つの方法は、結合を使用することです。

select t.*
from t left outer join
     t tnext
     on t.next = tnext.val
order by tnext.value

しかし、これはしませんか?

select t.*
from t
order by t.next
于 2012-11-16T18:36:04.840 に答える