以连续的方式查询父子关系

时间:2013-12-17 16:46:04

标签: sql sql-server parent-child

我正在尝试编写一个导入工具,将我的数据库从一个模式转换为另一个模式。

所以现在我遇到了一个使用父子关系的表(通过PK ID FK ParentID),我想连续选择所有记录。

我的查询风险是我可能会尝试导入一个子元素,其父元素尚未导入。这将导致记录集不会被导入,因此要避免。

我所做的查询如下:

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

不幸的是,这不起作用(它没有给我表中的所有记录),所以我需要一个查询,它给我表中的所有行,按子元素和父元素排序,我只能循环过来导入。

有人可以指导我吗?

1 个答案:

答案 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