【问题标题】:Find chain of columns values查找列值链
【发布时间】:2018-12-16 16:26:26
【问题描述】:

表:

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);

查询:我想找到111->112->113->114->111形式的完整链col1和col2 (这是完整的链,因为它以111 开头并以111 结尾)。

预期输出 2:

col1    col2
-------------
111     112
112     113
113     114
114     111 

【问题讨论】:

    标签: sql sql-server tsql sql-server-2008-r2 common-table-expression


    【解决方案1】:

    这里有更多细节以便更容易理解。首先,我们将使用递归的common table expression。然后,我们需要知道每个组的start value,以便知道何时对stop 进行递归。在您的情况下,这是 col01 的最小值,但我们可以有许多 start 值,所以我添加了一个组 ID - 您可以使用它来过滤最终结果。

    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;
    

    【讨论】:

    • 如果我发现另一个链例如117-&gt;118-&gt;119-&gt;117,需要做什么改变?
    • @MAK 当然可以。这就是为什么你有组 ID。您只需在第一次选择中识别这些值。
    猜你喜欢
    • 2018-12-16
    • 1970-01-01
    • 1970-01-01
    • 2012-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-10
    相关资源
    最近更新 更多