SQL DISTINCTで重複行を1行のみ表示する方法
SQL GROUP BYで複数の行を集計して1行で取得するでは複数行を集約して1行で表示する方法を紹介しましたが、GROUP BY
を使用せずに、同一のレコードが複数あるときに、1行のみ取得する方法を紹介します。
SELECT
のあとにDISTINCT
をつけると、同一のレコードを1行のみ取得するようになります。
id | first_name | last_name |
---|---|---|
1 | 一郎 | 山田 |
2 | 次郎 | 山田 |
3 | 三郎 | 田中 |
4 | 一郎 | 山田 |
SELECT DISTINCT
first_name,
last_name
FROM
employee
first_name | last_name |
---|---|
一郎 | 山田 |
次郎 | 山田 |
三郎 | 田中 |
上記例ではid=1と4
のレコードの取得結果は同じになるので、本来は2行出力されるはずのレコードが、DISTINCT
を指定することにより、1行のみ取得しています。
複数の列を指定した時
上記例の通り、SELECT
で指定したすべての列の値が同一の場合のみ1行に集約されます。
last_name
のみが同一のid=2
のレコードは普通に取得されます。
使用場面は意外と少ない
上記例のように社員全員を取得したい時に同姓同名のレコードは1行で表示したいとは実際には考えづらいですし、テーブル設計がしっかりとしていればDISTINCT
を使用する場面というのは意外と少ないです。
id
などキーとなる列を取得すれば、取得結果が全く同じレコードが複数あるということはめったにないので、「同じレコードが複数出力されてしまうのでDISTINCT
を使おう」という安易な発送は避けるべきです。
DISTINCT
を使用する前に、テーブルの結合条件がおかしくないか、などのバグの可能性をまず考えてみるのをおすすめします。