検索結果に重複が含まれている場合に、重複行を削除する時に使用するDISTINCT、本記事ではその使用例や、少し変わった使い方である種類数の抽出を紹介します。
※当ページにおいて、検索結果イメージのNULLは【NULL】と表現しています。
DISTINCTの概要および使用例
SELECT文において、SELECTとカラム指定の間にDISTINCTと記述することで、重複行を削除してデータを抽出することができます。NULLも正しく行えます。
-- テーブル
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
また、全カラム抽出する場合でも使用できます。
-- 重複行を削除して抽出(全カラム)
SELECT DISTINCT
*
FROM test_table
;
A B
---- ----
001 001
001 002
002 001
002 NULL
NULL 001
NULL NULL
エラーになるケース
DISTINCTを使用して抽出項目に指定していないカラムをソート(ORDER BY句)に指定するとエラー(ORA-01791)になります。
-- 重複行を削除して抽出(エラー)
SELECT DISTINCT
a
FROM test_table
ORDER BY b
;
ORA-01791: SELECT式が無効です。
種類数の抽出
DISTINCTの基本を押さえたところで、一つ少し変わった使い方を紹介します。
COUNTと併用することで種類数を抽出することができます。ただし、注意点としては、NULLは種類の一つとしてカウントしてくれない点です。
-- テーブル 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としてカウントされる点に注意が必要です。
-- テーブル A B ---- ---- 001 001 001 001 001 002 002 001 002 001 -- 種類数の取得 SELECT COUNT(DISTINCT a||b) CNT FROM test_table ; CNT --- 3

