代码之家  ›  专栏  ›  技术社区  ›  MAK

查找列值链

  •  1
  • MAK  · 技术社区  · 7 年前

    表:

    create table tbl_test
    (
        col1 int,
        col2 int
    );
    

    记录:

    INSERT INTO tbl_test VALUES(111,112),
                                (112,113),
                                (113,114),
                                (114,111),
                                (115,116),
                                (117,118),
                                (118,119),
                                (111,130),
                                (120,121),
                                (122,123),
                                (123,111),
                                (124,111);
    

    查询 :我想找到完整的链col1和col2的形式 111->112->113->114->111 (这是完整的链条,因为它从 111 最后是 一百一十一 )

    预期输出2:

    col1    col2
    -------------
    111     112
    112     113
    113     114
    114     111 
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   gotqn user3521065    7 年前
    start value stop col01 start

    WITH DataSource AS
    (
        SELECT col1
              ,col2
              ,0 as level
              ,ROW_NUMBER() OVER(ORDER BY Col1, col2) AS [groupID]
              ,0 as anchorMatched
              ,col1 as startValue
        FROM tbl_test
        WHERE col1 IN (SELECT MIN(col1) FROM tbl_test)
        UNION ALL
        SELECT A.col1
              ,A.col2
              ,level + 1
              ,B.[groupID]
              ,anchorMatched + CASE WHEN A.col1 = B.col2 AND A.col2 = B.startValue THEN 1 ELSE 0 END
              ,b.startValue
        FROM tbl_test A
        INNER JOIN DataSource B
            ON A.col1 = B.col2
        WHERE (anchorMatched = 0 AND A.col1 <> B.startValue)
    )
    SELECT *
    FROM DataSource
    WHERE groupID = 1;
    

    enter image description here