2010-01-11 4 views
0

Я пытаюсь написать рекурсивный запрос CTE в SQL Server 2005, но получаю нечетный набор результатов. Моя таблица:SQL-рекурсивный запрос CTE, набор нечетных результатов SQL Server 2005

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

Это мой КТР запрос:

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 

ответ

1

Ваша проблема вашей отправной точкой. Первая часть запроса CTE возвращает все строки (обратите внимание, что их уровень равен 0).

Затем - Ваша следующая часть запроса пойдет и получит все связанные строки (которые добавляются к вашему раннему набору результатов).

Я заметил, однако, что у вас нет записи для идентификатора 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 

Также см my answer to a similar question, чтобы показать правильный порядок сортировки (с использованием пути)

+0

Я выполнил запрос, но не получил никаких результатов. Я думаю, проблема в том, что «parentId is null», поэтому я выбрал его из моей версии. Я прочитал несколько форумов и версий/примеров и просто не понимаю, почему это не работает. – flavour404

+0

В моем коде предполагается, что вы добавите запись с идентификатором 4. Если вы этого не сделаете, вы должны иметь отправную точку другим способом. –

+0

См. Мой измененный ответ, который будет работать в вашем случае (я вернулся к таблице, чтобы увидеть, где не было дочерней записи). –

Смежные вопросы