SQL Server 2005 - CTE, сохранение значений и вставка в наборы данных - PullRequest
0 голосов
/ 12 января 2010

Допустим, у вас есть таблица как таковая (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

Как сохранить исходный дочерний идентификатор, чтобы вместо этого вы получили этот набор результатов:

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

Итак, в основном я делаю, сохраняя исходный идентификатор ребенка и возвращая его вместо другого ...

Это запрос 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

Ответы [ 3 ]

0 голосов
/ 12 января 2010

Не проверено, но вы пробовали это?

;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
0 голосов
/ 12 января 2010

Ваш 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 из запроса привязки.

0 голосов
/ 12 января 2010

Вы можете получить это, если сначала (в переменную), а потом использовать переменную.

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
...