0

假设您有一个这样的表(SQL SERVER 2005)

pairID childID parentID
 0       1      2
 1       2      3
 2       3      4

你有一个返回这个数据集的 CTE:

pairID childID parentID level
 0       1      2        2
 1       2      3        1
 2       3      4        0

如何保存初始子 ID,以便获得此结果集:

pairID childID parentID level
 0       1      2        2
 1       1      3        1
 2       1      4        0

所以基本上我正在做的是保留原来的孩子ID并返回它而不是另一个......

这是迄今为止的 CTE 查询,效果很好:

WITH TESTER AS (SELECT a.PairID,
                a.ChildID,
                a.ParentID,
                0 AS Level
                FROM
                BusinessHierarchy AS a 
                LEFT OUTER JOIN BusinessHierarchy AS 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 PairID, ChildID, ParentID, Level
 FROM  TESTER AS x
 ORDER BY Level, ChildID, ParentID
4

3 回答 3

0

恐怕你写的 CTE 让我感到困惑,所以我将其重写如下,它给出了你所要求的结果。这符合您的要求吗?

WITH List (pairID, childId, parentId, level, originalid )
AS
(
    -- Anchor member definition
    select pairID, childID, parentID, 0 as level, ChildID as originalid
    FROM    
    BusinessHeirarchy bh
    where bh.PairID = 0


    UNION ALL

    -- Recursive member definition
    select j.pairId, j.childID, j.parentID, lst.level +1 as level, lst.originalid
    from BusinessHeirarchy j inner join List lst 
    on  (lst.parentId = j.ChildID)

)

select * from list;

您显然可以根据需要使用输出列和顺序,但该数据符合您的要求。

使用我的 sql 时要注意的一件事是,我限制了基于零对的锚查询,因为您的示例数据没有空值。如果您需要空检查来拉出您的锚,这应该很容易更改。

然后,我只需使用附加列 OriginalId 加入父子关系,该列包含来自锚查询的第一个 childId。

于 2010-01-12T01:57:14.220 回答
0

如果首先(进入变量),您可以得到它,然后再使用该变量。

DECLARE @StartingId int

SELECT
    @StartingId = a.PairID
FROM BusinessHierarchy AS a 
LEFT OUTER JOIN BusinessHierarchy AS a2 ON a.ParentID = a2.ChildID
WHERE (a2.PairID IS NULL)


WITH TESTER AS (SELECT a.PairID,
            a.ChildID,
            a.ParentID,
            0 AS Level
            FROM
            BusinessHierarchy AS a 
            WHERE (a.PairID = @StartingId)
            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 PairID, @StartingId, ParentID, Level
FROM  TESTER AS x
ORDER BY Level, ChildID, ParentID
于 2010-01-12T01:40:47.597 回答
0

未经测试,但你试过吗?

;WITH My_CTE AS
(
     SELECT
          BH1.PairID,
          BH1.ChildID AS BaseID,
          BH1.ChildID,
          BH1.ParentID,
          0 AS Level
     FROM
          BussinessHierarchy BH1
     LEFT OUTER JOIN BussinessHierarchy BH2 ON
          BH1.ParentID = BH2.ChildID
     WHERE
          BH2.PairID IS NULL
     UNION ALL
     SELECT
          BH3.PairID,
          CTE.BaseID,
          BH3.ChildID,
          BH3.ParentID,
          CTE.Level + 1 AS Level
     FROM
          My_CTE CTE
     INNER JOIN BussinessHierarchy BH3 ON
          BH3.ParentID = CTE.ChildID
     )
SELECT
     PairID,
     BaseID,
     ParentID,
     Level
FROM
     My_CTE
ORDER BY
     Level,
     BaseID,
     ParentID
于 2010-01-12T01:50:55.830 回答