zukucode
主にWEB関連の情報を技術メモとして発信しています。

SQL DISTINCTで重複行を1行のみ表示する方法

SQL GROUP BYで複数の行を集計して1行で取得するでは複数行を集約して1行で表示する方法を紹介しましたが、GROUP BYを使用せずに、同一のレコードが複数あるときに、1行のみ取得する方法を紹介します。

SELECTのあとにDISTINCTをつけると、同一のレコードを1行のみ取得するようになります。

employee(社員)
idfirst_namelast_name
1一郎山田
2次郎山田
3三郎田中
4一郎山田
SELECT DISTINCT
  first_name,
  last_name
FROM
  employee
取得結果
first_namelast_name
一郎山田
次郎山田
三郎田中

上記例ではid=1と4のレコードの取得結果は同じになるので、本来は2行出力されるはずのレコードが、DISTINCTを指定することにより、1行のみ取得しています。

複数の列を指定した時

上記例の通り、SELECTで指定したすべての列の値が同一の場合のみ1行に集約されます。

last_nameのみが同一のid=2のレコードは普通に取得されます。

使用場面は意外と少ない

上記例のように社員全員を取得したい時に同姓同名のレコードは1行で表示したいとは実際には考えづらいですし、テーブル設計がしっかりとしていればDISTINCTを使用する場面というのは意外と少ないです。

idなどキーとなる列を取得すれば、取得結果が全く同じレコードが複数あるということはめったにないので、「同じレコードが複数出力されてしまうのでDISTINCTを使おう」という安易な発送は避けるべきです。

DISTINCTを使用する前に、テーブルの結合条件がおかしくないか、などのバグの可能性をまず考えてみるのをおすすめします。


関連記事