2013-10-31 37 views

回答

0

簡單的情形:只有第一間隙

你可以做到這一點:

SELECT 
    MIN(seq) 
FROM 
    (SELECT 
    sequence, 
    @seq:[email protected]+1 AS seq 
    FROM 
    t CROSS JOIN (SELECT @seq:=0) AS init) AS gap 
WHERE 
    sequence!=seq 

,尤其是圓形場sequence指向你的專欄,在這裏你要找的差距。見fiddle demo

現在常見的情況。

你不能只使用JOIN或類似的東西,因爲你的表的大小可能小於它可能的差距。想象一下這種情況,當你的桌子只有最小值和最大值時。例如,110 - 並且您想獲取所有行,因此結果將爲序列號1, 2, ... , 10。無論你如何將JOIN與自己的表,你只會得到兩行 - 因爲只有這兩個存在於你的表中。 UNION也不是一個選項 - 因爲如果我們將生成10,通常情況下可以是100,1000,電子郵件。因此,對於普通情況下,你必須創建順序表,並從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 
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); 

雖然這一個就完事了,有可能是在那裏更好,更緊湊的解決方案。

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 @[email protected]+1 
END 
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