我有一列,我在其中插入递增一的值(该列不是 AUTO_INCREMENT)。我如何搜索其中的空白,例如列:1,2,4,5,6 - 我想选择缺少的 3。谢谢!
问问题
189 次
4 回答
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
指向您的列,您正在寻找差距。见小提琴演示
现在,常见的情况。
你不能只使用JOIN
这样的东西,因为你的桌子的大小可能小于它可能的间隙。想象一下这种情况,当您的表中只有最小值和最大值时。例如,1
and 10
- 并且您想要获取所有行,因此 result 将是 sequence 1, 2, ... , 10
。无论您如何JOIN
使用自己的表格,您都只会得到两行 - 因为只有这两行存在于您的表格中。UNION
也不是一个选项 - 因为如果我们为 构建它10
,在常见情况下可以是100
, 1000
, e tc 所以对于常见情况,您必须创建序列表并用来自MIN(sequence)
和的值填充它MAX(sequence)
- 然后使用 LEFT JOIN,喜欢:
SELECT
full_table.sequence
FROM
full_table
LEFT JOIN t
ON full_table.sequence=t.sequence
WHERE
t.sequence IS NULL
于 2013-10-31T07:42:43.743 回答
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);
虽然这个可以完成工作,但可能会有更好、更紧凑的解决方案。
于 2013-10-31T07:45:35.660 回答
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
于 2013-10-31T07:46:41.557 回答
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
于 2013-10-31T07:52:22.203 回答