SQL Server 2008 R2:查找两列之间的链接和链

时间:2018-07-08 03:06:33

标签: sql sql-server sql-server-2008-r2

表格:

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 :在此查询中,我想找到

形式的col1col2之间的链接
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,111111,130,因为124不在col2中并且130没有进一步的链接,因此不应显示

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

预期的输出2:

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

1 个答案:

答案 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