我正在尝试编写一个导入工具,将我的数据库从一个模式转换为另一个模式。
所以现在我遇到了一个使用父子关系的表(通过PK ID
FK ParentID
),我想连续选择所有记录。
我的查询风险是我可能会尝试导入一个子元素,其父元素尚未导入。这将导致记录集不会被导入,因此要避免。
我所做的查询如下:
SELECT * FROM Table a INNER JOIN Table b ON (b.ParentID=a.ID and a.ID= b.ParentID)
不幸的是,这不起作用(它没有给我表中的所有记录),所以我需要一个查询,它给我表中的所有行,按子元素和父元素排序,我只能循环过来导入。
有人可以指导我吗?
答案 0 :(得分: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