了解下面的SQL查询

时间:2019-01-31 10:30:34

标签: sql-server

我需要您的帮助来了解以下查询,有人可以帮助我描述一下吗,我想知道 b.id为null r.id为null 在下面的查询中,如果有人可以解释整个代码,那会很棒吗?

select l.id as start,
(
    select min(a.id) as id
    from sequence as a
        left outer join sequence as b on a.id = b.id - 1
    where b.id is null
        and a.id >= l.id
) as end
from sequence as l
    left outer join sequence as r on r.id = l.id - 1
where r.id is null;

3 个答案:

答案 0 :(得分:0)

该查询正在使用外部联接联接两个表(在这种情况下为同一表,但没有关系)。

如果有

SELECT t1.a, t1.b, t2.d
FROM table1 t1
LEFT OUTER JOIN table2 t2 ON t1.a = t2.a
WHERE t2.a is null

这意味着它返回一组记录,其中包含所有来自table1的记录,但是对于table1中的每个记录,可能不会有来自table2的联接记录。如果没有table2字段,则将其返回为null,因此WHERE子句实际上是在向我返回来自table1的所有记录,而在table2中我们没有连接记录。

在您将其连接到其自身的示例中,您正在根据id查找是否没有下一个/上一个记录(取决于您以何种方式查看它)。如果id = 5,则没有id = 4的记录

整个sql看起来像返回序列表中的连续id范围。

答案 1 :(得分:0)

此查询返回序列的“岛屿”,即startend的连续ID间隔。

您可以在Special Islands和此处The SQL of Gaps and Islands in Sequences

上详细了解gapsislands

答案 2 :(得分:0)

查询正在查找连续数字的孤岛,输出所有连续数字都在其中的范围的开始和结束,因此对于集合是否为数字

{1,3,4,5,6,9,10}

我希望

1,1

2,6

9,10

要选择

外部查询从找到无法连接到包含N-1的记录的数字(N)开始,由r.id检测为null 然后,子查询会找到未加入包含M + 1的记录的第二个最高编号(M)(使用b.id检测为null)

因此在我的示例中3没有要连接的'2',这意味着3开始一个范围。没有后续记录的第一个数字> =等于6,没有要连接的'7'