2012-11-06 31 views
3

我有這樣的表如何用sql檢測錯誤的序列列?

ID | Seq 
------------ 
A  1  
A  2  
A  3  
B  1  
B  2  
B  3  
B  3  <--duplicate seq where ID=B 
C  1  
C  2 
C  4  <--missing seq id number 3 
D  1 
D  2 
.  . 
.  . 

有一種方法,如果檢測/時,有在SEQ列的邏輯錯誤,特別是如果有跳躍和/或重複。

+3

其中RDBMS? SQL服務器..或MySQL?還是Oracle? –

+0

這是針對SQL服務器的,但我深深感謝簡單的代碼,甚至可能與Oracle兼容 – jenswirf

回答

2

這些都是SQL不可知的,所以應該適用於任何rdbms。

這將檢查序列中一休:

select t1.id, t1.seq 
from t_seq t1 
where 
    t1.seq <> 1 
    and not exists (
    select * 
    from t_seq t2 
    where t2.id = t1.id 
     and t2.seq = t1. seq - 1  
) 

這將重複檢查:

select t1.id, t1.seq 
from mytable t1 
group by t1.id, t1.se1 
having count(*) > 1 
0

爲了讓你可以使用下面的T-SQL的重複。

SELECT ID, Seq FROM MyTable GROUP BY ID, Seq HAVING COUNT(Seq) > 1 

編輯

要找出我已經更新由njr101所提供的代碼丟失的序列號如下:

SELECT ID, Seq FROM MyTable t1 WHERE ID IN ( 
    SELECT ID FROM MyTable  
    GROUP BY ID 
    HAVING COUNT(DISTINCT Seq) <> MAX(Seq) 
) AND t1.seq <> 1 AND NOT EXISTS (
    SELECT * FROM MyTable t2 WHERE t2.id=t1.id AND t2.seq = t1.seq - 1 
) 
ORDER BY ID 

第一個子查詢計算爲不同的行數該ID(忽略重複)。如果該數字與結果集中包含的最大數量相同,則該值應該適用於該ID。如果不相等,結果將在子查詢中可用。

第二部分(在njr101的查詢的幫助下)將結果集過濾爲只包含最後一個ID和seq,其中應該插入缺失值。結果如下:

My Data 
========= 
A 1 
A 2 
A 3 
A 20 <--- Missing (displayed in results) 
B 1 
B 2 
B 3 
B 3 
B 4 
C 1 
C 2 
C 4 <--- Missing (displayed in results) 
C 5 
C 15 <--- Missing (displayed in results) 
C 16 

Results 
======= 
A 20 
C 4 
C 15