2012-05-24 49 views
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:
什麼是檢索屬於項目ID = 1所有記錄的最簡單的方法和它的所有的父母遞歸子項目和秩序。TSQL版本2008-R2 - 遞歸選擇

問題2:
什麼是檢索所有記錄以便通過父母的最簡單方法。

非常感謝..先進的!

+0

的SQL Server版本? – Thomas

+0

SQL版本是2008-R2 –

+0

我不確定「ParentHood訂購」的含義是什麼。預期訂單的一些示例輸出將很有用。這是否意味着由ParentItemId或其他東西? – Thomas

回答

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 Fiddle Example

+1

非常感謝您的及時回覆,並且向我展示了還有小提琴for SQL: - ) –

+0

看起來它需要一個'ORDER BY'子句。 – HABO