SQL Server 2008 R2:查找两列之间的链接和链
Posted
技术标签:
【中文标题】SQL Server 2008 R2:查找两列之间的链接和链【英文标题】:SQL Server 2008 R2: Find link and chain between two columns 【发布时间】:2018-07-08 03:06:32 【问题描述】:表:
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);
我需要为不同的输出编写 2 个不同的查询。
查询1:在这个查询中我想找到col1
和col2
之间的链接
111->112->113->114->111
和
117->118->119
和
122->123-111
预期输出 1:
col1 col2
-------------
111 112
112 113
113 114
114 111
117 118
118 119
122 123
123 111
尝试过:
SELECT
col1, col2
FROM
tbl_test t
WHERE
EXISTS (SELECT 1
FROM tbl_test t1
WHERE t.col1 = t1.col2
OR t.col2 = t1.col1)
上述查询返回 2 条额外记录,即 124,111
和 111,130
,由于 124
不在 col2 中且 130
没有更多链接,因此不应显示。
查询 2:在此查询中,我想以 111->112->113->114->111
的形式找到完整的链 col1
和 col2
(这是完整链,因为它以 111
和以111
结尾)。
预期输出 2:
col1 col2
-------------
111 112
112 113
113 114
114 111
【问题讨论】:
为什么122->123->111
不像122->123->111->112->113->114->111
那样继续?
@stickybit,它已经存在于查询 1 预期结果的前 4 条记录中。对于查询 2,只有从相同的值开始并以相同的值结束时,链才会完成。
对不起,如果我不清楚那里,我说的是查询1。最后一个序列122->123->111
,为什么它以111
结尾?我猜第一个111->112->113->114->111
以111
结尾,因为111
已经被该序列访问过,但是为什么122->123->111
以111
结尾?
我需要显示该行,因为它在 col1 之前就在 col2 中。我的意思是 123。
每个帖子一个问题,拜托。
【参考方案1】:
对于查询1: 只需找到所有值,其中一个的 col2 等于 col1(另一行的,不需要显示)
SELECT t1.col1, t1.col2
FROM tbl_test t1 inner join tbl_test t2
ON t1.col2 = t2.col1
Query2 更复杂,因为您要查找具有无限数量的链接条目的条目链。如果你可以限制链节的数量,你可以找到第一个条目(col1)等于最后一个条目(col2)的所有成员。
例如:没有链节:
SELECT t1.col1, t1.col2
FROM tbl_test t1 inner join tbl_test t2
ON t1.col2 = t2.col1 AND t2.col2 = t1.col1
一个链环(仅显示链的起始元素):
SELECT t1.col1, t1.col2
FROM tbl_test t1 inner join tbl_test t2 ON t1.col2 = t2.col1
inner join tbl_test t3 ON t2.col1 = t3.col1
WHERE t3.col2 = t.col1
【讨论】:
请不要使用隐式连接。 ANSI SQL 完全支持显式连接已超过 25 年。以上是关于SQL Server 2008 R2:查找两列之间的链接和链的主要内容,如果未能解决你的问题,请参考以下文章
SQL Server 2008 R2:查找比给定数字长的单元格
从开发人员的 POV 看 SQL Server 2008 和 SQL Server 2008 R2 之间的差异
如何在 Sql Server 2008 R2 中将列转换为行?