【问题标题】:Get all linked IDs of the same table for a given IDs (CTE)获取给定 ID (CTE) 的同一表的所有链接 ID
【发布时间】:2019-06-14 11:46:10
【问题描述】:

有一个表结构如下(简化):

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 1 的所有链接 RowID,我希望得到以下列表:

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

有什么想法吗?

【问题讨论】:

    标签: sql sql-server common-table-expression recursive-query


    【解决方案1】:

    你需要在两个方向上遍历层次结构:

    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;
    

    【讨论】:

    • 太棒了!谢谢!会尝试的:-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    • 2013-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多