我有一个列,其中我插入的值加1(该列不是AUTO_INCREMENT)。如何在其中搜索空白,例如专栏:1,2,4,5,6 - 我想选择缺少的3.谢谢!
答案 0 :(得分:0)
简单案例:只有第一个差距
你可以这样做:
SELECT
MIN(seq)
FROM
(SELECT
sequence,
@seq:=@seq+1 AS seq
FROM
t CROSS JOIN (SELECT @seq:=0) AS init) AS gap
WHERE
sequence!=seq
- 其中字段sequence
指向您的列,您正在寻找差距。见fiddle demo
现在,常见的情况。
你不能只使用JOIN
或类似的东西,因为你的桌子的大小可能小于它的可能差距。想象一下这种情况,当你的表只填充最小值和最大值时。例如,1
和10
- 并且您希望获取所有行,因此结果将是序列1, 2, ... , 10
。无论你如何JOIN
你自己的桌子,你只会得到两排 - 因为你的桌子里只有这两排。 UNION
也不是一个选项 - 因为如果我们为10
构建100
,通常情况下可以是1000
,MIN(sequence)
,e t.c。因此,对于常见情况,您必须创建序列表并使用MAX(sequence)
和SELECT
full_table.sequence
FROM
full_table
LEFT JOIN t
ON full_table.sequence=t.sequence
WHERE
t.sequence IS NULL
中的值填充它 - 然后使用LEFT JOIN执行以下操作:
{{1}}
答案 1 :(得分:0)
这就是我用于这些任务的陈述。 id
表示您要分析的字段。
SELECT t1.id+1 AS 'start_seq',
MIN(t2.id) - 1 AS 'end_seq'
FROM yourTable AS t1,
yourTable AS t2
WHERE t1.id < t2.id
GROUP BY t1.id
HAVING 'start_seq' < MIN(t2.id);
虽然这个工作已经完成,但可能会有更好,更紧凑的解决方案。
答案 2 :(得分:0)
试试这个!!
DECLARE @a int
SET @a = SELECT MIN(num) FROM table1
WHILE (SELECT MAX(num) FROM table1 ) > @a
BEGIN
IF @a NOT IN ( SELECT num FROM table1 )
PRINT @a
SET @a=@a+1
END
答案 3 :(得分:0)
您可以尝试这样的事情
SELECT (t1.id + 1) as gap_starts_at,
(SELECT MIN(t3.id) -1 FROM your_table t3 WHERE t3.id > t1.id) as gap_ends_at
FROM your_table t1
WHERE NOT EXISTS (SELECT t2.id FROM your_table t2 WHERE t2.id = t1.id + 1)
HAVING gap_ends_at IS NOT NULL