2013-12-17 65 views
0

我想寫一個導入工具將我的數據庫從一個模式轉換爲另一個模式。以連續的方式查詢親子關係

所以現在我遇到了一個使用父子關係的表格(通過PK ID FK ParentID),我想連續選擇所有記錄。

我的查詢的風險是,我可能會嘗試導入其父元素尚未導入的子元素。這將導致不會導入的記錄集,因此需要避免。

我查詢我工作的是如下:

SELECT * FROM Table a INNER JOIN Table b ON (b.ParentID=a.ID and a.ID= b.ParentID) 

遺憾的是不工作(它不給我表中的所有記錄),所以我需要一個查詢,讓我列表中的所有行,按子元素和父元素排序,我可以循環導入。

有人可以指導我的方式嗎?

+0

查詢中的'和'子句不是必須的,因爲它們在兩種情況下都是相同的。但是在這種情況下,我可能會首先導入所有的「父」記錄,然後是所有的「子」記錄,所以像'import into TableB select * from Table where ParentID is null' then'import into TableB select *從表中ParentID不爲空的表。 – beercodebeer

+0

我也想過類似的東西。但是,這是行不通的,因爲繼承深度大於1.所以一個子元素可能是另一個子元素的父元素。 – SeToY

+0

但是必須有一些絕對父元素,不是嗎?元素不是自己的孩子?如果是這種情況,那麼你仍然可以運行第一個查詢,然後重複執行如下所示的操作,直到獲得所有記錄:'Insert into TableB select * from Table where ParentID is not null and exists(select 1 from TableB where ID = Table.ParentID)' – beercodebeer

回答

1

什麼你要找的是一個遞歸公用表表達式,可以在此鏈接中找到: http://technet.microsoft.com/en-us/library/ms186243%28v=sql.105%29.aspx

您可以使用此要告訴你的下游ETL序列東西應該被加載。例如,所有1都是第一個,第二個是第二個等等。

DECLARE @Table TABLE (
ID INT, 
ParentId INT) 

INSERT INTO @Table 
VALUES 
    (1, 0), 
    (2, 1), 
    (3, 1), 
    (4, 0), 
    (5, 4), 
    (6, 4), 
    (7, 1), 
    (8, 7) 

--This is the anchor query and selects top level records 
;WITH cte_Recursive AS (
    SELECT ID, ParentId, 1 [Depth] 
    FROM @Table 
    WHERE ParentId = 0 

    UNION ALL 

    SELECT T.ID, T.ParentId 
     ,R.Depth + 1 [Depth] 
    FROM @Table T 
    INNER JOIN cte_Recursive R ON R.ID = T.ParentId 
) 

SELECT * 
FROM cte_Recursive 
+0

現在這是正是我想要的......現在我甚至知道它叫什麼。謝謝! :) – SeToY