0

我正在尝试在 SQL Server 2005 中编写递归 CTE 查询,但得到一组奇怪的结果。我的桌子是:

PairID  ChildID ParentID
900        1        2       
901        2        3       
902        3        4       

这是我的 CTE 查询:

WITH TESTER (PairID, 
             ChildID, 
             ParentID, 
             Level)
AS (SELECT a.PairID, a.ChildID,a.ParentID, 0 AS Level
    FROM BusinessHierarchy AS a
    UNION ALL
    SELECT b.PairID, b.ChildID, b.ParentID, oh.Level + 1 AS Level
    FROM BusinessHierarchy AS b INNER JOIN
    TESTER AS oh ON b.ChildID =  oh.ParentID)
SELECT 
      x.PairID, 
      x.ChildID,
      x.ParentID,
      x.Level
 FROM TESTER AS x
 ORDER BY x.Level, x.ChildID, x.ParentID

好的,所以我现在得到了一个数据集返回,但是,它并不像预期的那样包含以下方式的重复:

PairID  ChildID ParentID Level
900     1       2        0
901     2       3        0
902     3       4        0
...

900     2       3        1
901     3       4        1
...

900     3       4        2

如果有人可以向我解释为什么会发生这种情况以及我将如何纠正它,我将不胜感激。

至于我的最后一个问题,我将如何修改它以显示每个父母的初始 childID,如下所示:

Original
PairID  ChildID ParentID Level
900     1       2        0
901     2       3        1
902     3       4        2

I want it displayed as:
PairID  ChildID ParentID Level
900     1       2        0
901     1       3        1
902     1       4        2
4

1 回答 1

1

你的问题是你的起点。CTE 查询的第一部分返回所有行(注意它们的级别全为 0)。

然后 - 您的下一部分查询将获取所有相关行(这会添加到您之前的结果集中)。

但是,我确实注意到您没有 id 为 4 的记录

如果你这样做了,你会这样做:

;WITH TESTER (PairID, ChildID, ParentID, Level) AS (
    SELECT
        a.PairID,
        a.ChildID,
        a.ParentID,
        0 AS Level
    FROM BusinessHierarchy AS a
    LEFT JOIN BusinessHierarchy a2 ON a.ParentID = a2.ChildID
    WHERE a2.PairID is null

    UNION ALL

    SELECT
        b.PairID,
        b.ChildID,
        b.ParentID,
        oh.Level + 1 AS Level
    FROM BusinessHierarchy AS b
    INNER JOIN TESTER AS oh ON b.ParentID =  oh.ChildID
)

SELECT 
    x.PairID, 
    x.ChildID,
    x.ParentID,
    x.Level
FROM TESTER AS x
ORDER BY x.Level, x.ChildID, x.ParentID

另外,请参阅我对类似问题的回答以显示正确的排序顺序(使用路径)

于 2010-01-11T22:42:55.803 回答