2017/12/07
検索結果に重複が含まれている場合に、重複行を削除する時に使用するDISTINCT、本記事ではその使用例や、少し変わった使い方である種類数の抽出を紹介します。
※当ページにおいて、検索結果イメージのNULLは【NULL】と表現しています。
sponsored link
DISTINCTの概要および使用例
SELECT文において、SELECTとカラム指定の間にDISTINCTと記述することで、重複行を削除してデータを抽出することができます。NULLも正しく行えます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
-- テーブル A B ---- ---- 001 001 ←重複① 001 001 ←重複① 001 002 002 001 ←重複② 002 001 ←重複② 002 NULL ←重複③ 002 NULL ←重複③ NULL 001 NULL NULL -- 重複行を削除して抽出 SELECT DISTINCT a ,b FROM test_table ; A B ---- ---- 001 001 001 002 002 001 002 NULL NULL 001 NULL NULL |
また、全カラム抽出する場合でも使用できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
-- 重複行を削除して抽出(全カラム) SELECT DISTINCT * FROM test_table ; A B ---- ---- 001 001 001 002 002 001 002 NULL NULL 001 NULL NULL |
エラーになるケース
DISTINCTを使用して抽出項目に指定していないカラムをソート(ORDER BY句)に指定するとエラー(ORA-01791)になります。
1 2 3 4 5 6 7 8 |
-- 重複行を削除して抽出(エラー) SELECT DISTINCT a FROM test_table ORDER BY b ; ORA-01791: SELECT式が無効です。 |
種類数の抽出
DISTINCTの基本を押さえたところで、一つ少し変わった使い方を紹介します。
COUNTと併用することで種類数を抽出することができます。ただし、注意点としては、NULLは種類の一つとしてカウントしてくれない点です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
-- テーブル A ---- 001 001 001 002 002 003 NULL ←NULLなのでカウント対象外 -- 種類数の抽出 SELECT COUNT(DISTINCT a) CNT FROM test_table ; CNT --- 3 |
複数カラムの組み合わせでの種類数を抽出することも、文字列の結合【||】を使用することで可能です。
ただし、やはり全てのカラムでNULLの場合にカウントしてくれない点と、結合したら同じ文字列になるケース(例えば、A||BC と AB||C は同じ)は1としてカウントされる点に注意が必要です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
-- テーブル A B ---- ---- 001 001 001 001 001 002 002 001 002 001 -- 種類数の取得 SELECT COUNT(DISTINCT a||b) CNT FROM test_table ; CNT --- 3 |