SQL 查询:在主键中查找间隙

Posted

技术标签:

【中文标题】SQL 查询:在主键中查找间隙【英文标题】:SQL query: finding a gap in a primary key 【发布时间】:2010-10-06 08:59:16 【问题描述】:

如何编写执行以下操作的单个 select 语句:

我的表中有一个整数列,我想在该列中找到最小可用(未使用)值,其中该值低于 1000,并且该值在 TableB Column1 中不存在

谢谢

【问题讨论】:

【参考方案1】:

类似于 LukeH 的回答,但它可以满足您的要求:

SELECT MIN(a.your_column) - 1 AS answer
FROM your_table AS a
LEFT JOIN your_table AS a2
        ON a2.your_column = a.your_column - 1
LEFT JOIN tableB AS b
        ON a.your_column = b.column1
WHERE a.your_column < 1000
    AND b.column1 IS NULL
    AND a2.your_column IS NULL

编辑:

UNION
SELECT MIN(a.your_column) + 1 AS answer
FROM your_table AS a
LEFT JOIN your_table AS a2
        ON a2.your_column = a.your_column + 1
LEFT JOIN tableB AS b
        ON a.your_column = b.column1
WHERE a.your_column < 1000
    AND b.column1 IS NULL
    AND a2.your_column IS NULL

然后选择两个值中的最小值。

它仍然需要检查值 1 是否可用,但如果 A 和 B 之间存在差距,它现在应该找到 A+1 和 B-1,你可以选择最小的。显然 A+1 是最小的,所以你可以使用第二部分...

【讨论】:

有点效果!该解决方案只会得到一个未使用的值,该值比已使用的值少一个值。因此,如果数据库中的最小值为 100,您的查询返回 99 .. 它应该返回 1。有没有办法让它变得更好?【参考方案2】:

结果为 7,根据您的标准,我相信这将是正确答案

CREATE TABLE #TableA (Value INT)
INSERT #TableA (Value) VALUES (1)
INSERT #TableA (Value) VALUES (2)
INSERT #TableA (Value) VALUES (3)
INSERT #TableA (Value) VALUES (5)
INSERT #TableA (Value) VALUES (6)
INSERT #TableA (Value) VALUES (8)

CREATE TABLE #TableB (Value INT)
INSERT #TableB (Value) VALUES (4)

SELECT    MIN(A1.Value) + 1
FROM      #TableA A1
LEFT JOIN #TableA A2 ON A2.Value = A1.Value + 1
LEFT JOIN #TableB B1 ON B1.Value = A1.Value + 1
WHERE     A2.Value IS NULL
AND       B1.Value IS NULL
AND       A1.Value < 1000

DROP TABLE #TableA
DROP TABLE #TableB

【讨论】:

以上是关于SQL 查询:在主键中查找间隙的主要内容,如果未能解决你的问题,请参考以下文章

在一个查询中从多个主键中提取条目

afterupdate 在主键中留下空白

SQL查询查找表的主键?

动态 SQL Server 查询循环遍历架构查找主键重复

sql 查找因主键(PK)违规而可能阻止查询的所有重复条目

如何查找MySQL中查询慢的SQL语句