从列表中查找而不使用提前滞后和CTE缺失值

时间:2018-09-28 04:52:53

标签: sql sql-server

如果我得到如下表。现在基于此我们知道仅缺少1个ID,即4。有没有办法找到这个没有 使用Lead,Lag,CTE,并且仅使用单选和Joins

ID  Name
1   Tom
2   Betty
3   Ram
5   John
6   Doe

3 个答案:

答案 0 :(得分:2)

您可以使用自我联接并检查“先前”值是否丢失:

allowMainThreadQueries()

输出:

SELECT t1.ID - 1 AS Missing_ID
FROM table1 t1
LEFT JOIN table1 t2 ON t2.ID = t1.ID - 1
WHERE t2.ID IS NULL AND t1.ID > 1

SQLFiddle Demo

答案 1 :(得分:1)

如果您只想检测一个缺失的缺口,请考虑以下查询:

Missing_ID
4

这里的逻辑是针对每条记录检查是否存在SELECT ID - 1 AS missing FROM yourTable t1 WHERE NOT EXISTS (SELECT 1 FROM yourTable t2 WHERE t2.ID = t1.ID - 1) AND ID > 1; 值,该值比正在扫描的当前行小{em> not 。在这种情况下,我们返回当前的ID值减去一。

Demo

但是,也许更好的方法是将包含完整序列的表左连接到当前表,然后断言缺少的值:

ID

答案 2 :(得分:1)

使用ROW_NUMBER()函数尝试此操作:

SELECT tempid
FROM
(
    SELECT *, ROW_NUMBER() OVER (ORDER BY id) AS tempid
    FROM #temp
) a
LEFT JOIN #temp
    ON a.tempid = #temp.id
WHERE #temp.id IS NULL;

tempid
4

Demo