19

リンクされたリストを自己参照データベース テーブルとして実装しました。

CREATE TABLE LinkedList(
    Id bigint NOT NULL,
    ParentId bigint NULL,
    SomeData nvarchar(50) NOT NULL) 

ここで、Id は主キーで、ParentId はリストの前のノードの ID です。最初のノードには、ParentId = NULL があります。

ここで、テーブルから SELECT を実行し、リストのノードとして表示される順序で行を並べ替えます。

例: テーブルに行が含まれている場合

Id      ParentId  SomeData
24971   NULL      0
38324   24971     1
60088   60089     3
60089   38324     2
61039   61497     5
61497   60088     4
109397  109831    7
109831  61039     6

次に、基準を使用して並べ替えると、次のようになります。

Id      ParentId  SomeData
24971   NULL      0
38324   24971     1
60089   38324     2
60088   60089     3
61497   60088     4
61039   61497     5
109831  61039     6
109397  109831    7

コントロールとしてSomeData列を使用することになっているので、 ORDER by SomeData をごまかさないでください :-)

4

4 に答える 4

12

SQLServer のソリューションを見つけましたが、大きく見え、Quassnoi のソリューションよりも洗練されていません。

WITH SortedList (Id, ParentId, SomeData, Level)
AS
(
  SELECT Id, ParentId, SomeData, 0 as Level
    FROM LinkedList
   WHERE ParentId IS NULL
  UNION ALL
  SELECT ll.Id, ll.ParentId, ll.SomeData, Level+1 as Level
    FROM LinkedList ll
   INNER JOIN SortedList as s
      ON ll.ParentId = s.Id
)

SELECT Id, ParentId, SomeData
  FROM SortedList
 ORDER BY Level
于 2009-02-05T13:05:57.387 に答える
11

Oracleの場合:

SELECT Id, ParentId, SomeData
FROM (
  SELECT ll.*, level AS lvl
  FROM LinkedList ll
  START WITH
    ParentID IS NULL
  CONNECT BY
    ParentId = PRIOR Id
)
ORDER BY
  lvl

PSインデックスで検索できないため、として使用することはNULLお勧めできません。ParentIDのIDを持つ代理ルートを挿入し、0代わり-1に。を使用しますSTART WITH ParentID = 0

于 2009-02-05T12:43:30.440 に答える
6

(編集:ああ!私がデバッグしている間にあなたもそれを見つけました!)

SQL Server の場合:

;WITH cte (Id, ParentId, SomeData, [Level]) AS (
    SELECT Id, ParentId, SomeData, 0
    FROM LinkedList
    WHERE ParentId IS NULL
    UNION ALL
    SELECT ll.Id, ll.ParentId, ll.SomeData, cte.[Level] + 1
    FROM LinkedList ll
    INNER JOIN cte ON ll.ParentID = cte.ID
)
SELECT * FROM cte
ORDER BY [Level]
于 2009-02-05T13:10:31.243 に答える