-1

我有一列,我在其中插入递增一的值(该列不是 AUTO_INCREMENT)。我如何搜索其中的空白,例如列:1,2,4,5,6 - 我想选择缺少的 3。谢谢!

4

4 回答 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这样的东西,因为你的桌子的大小可能小于它可能的间隙。想象一下这种情况,当您的表中只有最小值和最大值时。例如,1and 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 回答