表格:
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)
上面的查询返回了两个额外的记录,分别为124,111
和111,130
,因为124
不在col2中并且130
没有进一步的链接,因此不应显示
查询2 :在此查询中,我想找到col1
形式的完整链col2
和111->112->113->114->111
(这是完整链,因为它以111
开头,以111
结尾)。
预期的输出2:
col1 col2
-------------
111 112
112 113
113 114
114 111
答案 0 :(得分:0)
对于查询1: 只需查找所有值,其中一个的col2等于col1(另一行的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