3

私はこのテーブルを持っています

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 列のロジックにエラーがあるかどうか、特にジャンプや重複があるかどうかを検出する方法はありますか。

4

3 に答える 3

7

これを試して:

これは、SQLサーバーとOracleの両方で機能するはずです

select ID,seq
       from(
            select ID,seq,
                   row_number() over (partition by id order by seq ) rn
            from t_seq)a
where a.seq<>a.rn


SQL サーバーの SQL フィドル デモ


Oracle の SQL Fiddle デモ

于 2012-11-06T12:21:05.483 に答える
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
于 2012-11-06T12:20:08.460 に答える
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の値は問題ないはずです。等しくない場合、結果はサブクエリで利用可能になります。

2番目の部分(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
于 2012-11-06T12:24:21.860 に答える