1
DECLARE @MAIN TABLE
(
  MainID INT NOT NULL, 
  Name VARCHAR(20) NOT NULL,
  [Deleted] BIT NOT NULL
);

DECLARE @ITEMS TABLE
(
  ItemID INT NOT NULL, 
  ParentItemID INT NULL,
  MainID INT NOT NULL, 
  Data VARCHAR(100) NOT NULL
);


INSERT INTO @MAIN (MainID, Name, [Deleted]) VALUES  (1, 'Tool 1', 0)
INSERT INTO @MAIN (MainID, Name, [Deleted]) VALUES  (2, 'Tool 2', 0)

INSERT INTO @ITEMS (ItemID, ParentItemID, MainID, Data) VALUES (1, NULL, 1, 'Level 1')
INSERT INTO @ITEMS (ItemID, ParentItemID, MainID, Data) VALUES (2, NULL, 1, 'Level 2')
INSERT INTO @ITEMS (ItemID, ParentItemID, MainID, Data) VALUES (3, NULL, 2, 'Level 1 - Irrelevant')
INSERT INTO @ITEMS (ItemID, ParentItemID, MainID, Data) VALUES (4, NULL, 1, 'Level 3')

INSERT INTO @ITEMS (ItemID, ParentItemID, MainID, Data) VALUES (5, 1, 1, 'Item 1-A')
INSERT INTO @ITEMS (ItemID, ParentItemID, MainID, Data) VALUES (6, 4, 1, 'Item 2-C')
INSERT INTO @ITEMS (ItemID, ParentItemID, MainID, Data) VALUES (7, 7, 2, 'Item Irrelevant 1')
INSERT INTO @ITEMS (ItemID, ParentItemID, MainID, Data) VALUES (8, 10, 1, 'Item 3-E')

INSERT INTO @ITEMS (ItemID, ParentItemID, MainID, Data) VALUES (9, 1, 1, 'Item 1-B')
INSERT INTO @ITEMS (ItemID, ParentItemID, MainID, Data) VALUES (10, 4, 1, 'Item 2-D')
INSERT INTO @ITEMS (ItemID, ParentItemID, MainID, Data) VALUES (11, 7, 2, 'Item Irrelevant 2')
INSERT INTO @ITEMS (ItemID, ParentItemID, MainID, Data) VALUES (12, 10, 1, 'Item 3-F')

INSERT INTO @ITEMS (ItemID, ParentItemID, MainID, Data) VALUES (13, 5, 1, 'Item 1-A-1')
INSERT INTO @ITEMS (ItemID, ParentItemID, MainID, Data) VALUES (14, 8, 1, 'Item 2-C-1')
INSERT INTO @ITEMS (ItemID, ParentItemID, MainID, Data) VALUES (15, 5, 2, 'Item 1-A-2')
INSERT INTO @ITEMS (ItemID, ParentItemID, MainID, Data) VALUES (16, 9, 1, 'Item 1-B-1')


SELECT * FROM @MAIN
SELECT * FROM @ITEMS

質問 1: ItemID = 1
に属するすべてのレコードを取得し、そのすべてが再帰的なサブアイテムであり、ParentHood で並べ替える最も簡単な方法は何ですか

質問 2:すべてのレコードを ParentHood 順
に取得する最も簡単な方法は何ですか?

どうもありがとう..高度な!!

4

1 に答える 1

4

必要なのは、階層クエリを実行できる共通テーブル式を使用することです。

;With AllItems As
    (
    Select I.ItemId, Null As ParentItemId, M.MainId, M.Name, M.[Deleted]
    From @Items As I
        Join @Main As M
            On M.MainID = I.MainID
    Where ParentItemId Is Null
    Union All
    Select I.ItemId, I.ParentItemId, M.MainId, M.Name, M.[Deleted]
    From @Items As I
        Join AllItems As P
            On P.ItemId = I.ParentItemId
        Join @Main As M
            On M.MainID = I.MainID
    )
Select *
From AllItems

WITH common_table_expression (Transact-SQL)

SQL フィドルの例

于 2012-05-24T02:55:04.740 に答える