[英]SQL recursive CTE query, odd results set SQL Server 2005
我試圖在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
您的問題是您的出發點。 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
另外,請參閱我對類似問題的回答,以顯示正確的排序順序(使用路徑)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.