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