SQLで連番か否かを判定する方法
結論
HAVING句を使用します。 詳しい手法は以下に記載していきます。
準備物
testテーブル
id | name |
---|---|
1 | 山田 |
2 | 佐藤 |
3 | 加藤 |
5 | 吉田 |
6 | 田中 |
7 | 山本 |
手法①
-- 対象のテーブルが連番かどうかだけの判定 SELECT '抜けあり' FROM test HAVING COUNT(*) <> MAX(id);
なお、GROUP BY句が省略されていますが、この内容については達人に学ぶSQL徹底指南書 第2版 初級者で終わりたくないあなたへで以下のように説明されています。
このSQL文にはGROUP BY句が存在しません。こういう場合、テーブル全体が1行に集約されます。その場合でも、HAVING句は問題なく使えます。
確かにGROUP BY句使ってこねくり回してみましたがうまくいきませんでした。
手法②
-- 対象のテーブルが連番ではない場合、抜けているIDの最小値を抽出 SELECT MIN(id + 1) FROM test WHERE (id + 1) NOT IN (SELECT id FROM test);
挙動としては
①NOT IN句内のサブクエリでid[1,2,3,5,6,7]が抽出
②NOT IN句なので、WHEREの条件が、id[1,2,3,5,6,7]に存在するかどうかを調べる
③whereの条件が(id + 1)なので、(id + 1)[2,3,4,6,7,8]がid[1,2,3,5,6,7]に存在するかどうか調べる
id + 1 | id | |
---|---|---|
2 | 1 | |
3 | 2 | |
4 | ←なし | 3 |
6 | 5 | |
7 | 6 | |
8 | ←なし | 7 |
④SELECT句で、MIN(id + 1)と記述しているので最小値の4が返る。
まとめ
この記事は以下の情報を参考にして執筆しました。 達人に学ぶSQL徹底指南書 第2版 初級者で終わりたくないあなたへ
他にも連番を探すやり方が記述していましたので、時間あるときにまた続き書きます。