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

SQL查询:在主键中查找间隙,sql,sql-server,tsql,gaps-and-islands,Sql,Sql Server,Tsql,Gaps And Islands,如何编写执行以下操作的单个select语句: 我的表中有一个整数列,我想在该列中找到最小可用未使用值,该值低于1000,并且该值在表B Column1中不存在 谢谢与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 ta

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

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


谢谢

与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
编辑:

并选择两个值中的最小值


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

这将得到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

有点用!该解决方案将只获得一个未使用的值,该值比已使用的值小一个值。因此,如果数据库中的最小值为100,则查询返回99。。它应该返回1。有没有办法让它变得更好?
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