簡體   English   中英

獲取給定ID(CTE)的同一表的所有鏈接ID

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM