[英]Get all linked IDs of the same table for a given IDs (CTE)
有一個具有以下結構(簡化)的表:
RowID FK_RowID
1 3
2 1
3 11
4 2
5 4
6 1
7 8
8 9
9
10
11
我要擁有的是我得到所有鏈接的RowID的列表,以及那里的鏈接的RowID。
例如,我想要所有鏈接的RowID為RowID 1,我期望以下列表:
2
3
4
5
6
11
我嘗試了以下CTE,但我只得到2,3,6,11:
;WITH CTE
AS (
SELECT RowID, FK_RowID, 1 AS Depth
FROM tbl
WHERE RowID = 1
UNION ALL
SELECT e.RowID, e.FK_RowID, CTE.Depth + 1 AS Depth
FROM CTE
INNER JOIN tbl AS e
ON e.RowID = CTE.FK_RowID
WHERE CTE.Depth < 50
)
SELECT DISTINCT RowID
FROM CTE
WHERE RowID <> 1
UNION
SELECT RowID FROM tbl WHERE FK_RowID = 1
它僅獲得直接路徑1-> 3-> 11,但我也需要其他路徑:2-> 4-> 5
有任何想法嗎?
您需要在兩個方向上遍歷層次結構:
DECLARE @ID int = 1;
WITH VTE AS(
SELECT *
FROM (VALUES(1,3),
(2,1),
(3,11),
(4,2),
(5,4),
(6,1),
(7,8),
(8,9),
(9,NULL),
(10,NULL),
(11,NULL))V(RowID,FK_RowID)),
Children AS(
SELECT V.RowID,
V.FK_RowID
FROM VTE V
WHERE V.RowID = @ID
UNION ALL
SELECT V.RowID,
V.FK_RowID
FROM Children C
JOIN VTE V ON C.RowID = V.FK_RowID),
Parents AS(
SELECT V.RowID,
V.FK_RowID
FROM VTE V
WHERE V.RowID = @ID
UNION ALL
SELECT V.RowID,
V.FK_RowID
FROM Parents P
JOIN VTE V ON P.FK_RowID = V.RowID)
SELECT RowID
FROM Children
WHERE RowID != @ID
UNION ALL
SELECT RowID
FROM Parents
WHERE RowID != @ID;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.