查找列值链
Find chain of columns values
Table:
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
为了更容易理解,这里有更多的细节。首先,我们将使用递归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;
Table:
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
为了更容易理解,这里有更多的细节。首先,我们将使用递归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;