我需要您的帮助来了解以下查询,有人可以帮助我描述一下吗,我想知道 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;
答案 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)
此查询返回序列的“岛屿”,即start
和end
的连续ID间隔。
您可以在Special Islands和此处The SQL of Gaps and Islands in Sequences
上详细了解gaps
和islands
答案 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'