トップ > SQL入門 > 4章
4章 重複行の排除
第4章では重複行の排除方法について書いていきます。
重複行の排除というのは、同じ値をまとめてしまえという機能です。

DISTINCT


例えば、employees表には部署コード(DEPT_ID)というものがあります。
これは各従業員がどこの部署に配属されているのかを示す値となっています。

それでは確認してみます。

  SQL> select dept_id from employees;

     DEPT_ID
  ----------

          20
          10
          10
          50
          40
          40
          40
          40
          30
          30
          30
          30
          30
          20
          20
          40
          30
          50

  20 rows selected.
  

表示されました。同じ部署に配属されているので、もちろん同じコードの従業員が存在します。
では、部署コードがいくつあるのかを確認した場合、重複した値があると見づらいですね。
その場合は、重複行を排除して表示させます。

[構文] 重複行の排除
 SELECT DISTINCT 列名 FROM 表名;

では、実行してみます。

  SQL> SELECT DISTINCT dept_id FROM employees;

     DEPT_ID
  ----------

          50
          30
          40
          20
          10

  6 rows selected.


重複行を排除し一意な値で表示されました。このように重複行を排除したい場合は、
DISTINCTキーワードを使用します。

では、次の実行例です。

  SQL> SELECT emp_id, DISTINCT dept_id FROM employees;
  SELECT emp_id, DISTINCT dept_id FROM employees
                 *
  ERROR at line 1:
  ORA-00936: missing expression


emp_id列はそのまま表示させて、dept_idは重複行を排除して表示させようとしましたが、
エラーになりました。これは実行結果が出力できないからです。

employees表は全部で20行あります。そのため、emp_id列は20行表示されます。
dept_idは重複排除すると6行でした。

その為、emp_id列とdept_id列で表示する行数が違うので、Oracleはエラーを出力します。

ただDISTINCTキーワードは全体の列に対して指定することが出来ます。
列の組み合わせで一意になる場合は、重複行とみなし排除して表示します。

  SQL> SPAN>select DISTINCT emp_id, dept_id FROM employees;

      EMP_ID    DEPT_ID
  ---------- ----------
           1
           2         20
           3         10
           4         10
           5         50
           6         40
           7         40
           8         40
           9         40
          10         30
          11         30
          12         30
          13         30
          14         30
          15         20
          16         20
          17         40
          18         30
          19         50
          20

  20 rows selected.


上記の例は、emp_idとdept_idの組み合わせで重複する行を排除します。

たとえば、emp_idが3,4はdept_idが10と同じ値ですが、emp_idは同じではないため、
重複行とはなりません。emp_id,dept_idが同じ行を排除します。

[補足] 複数列の重複行

A B
----- -----
AAA BBB
AAA BBC ← B列は同じでないので重複ではない
AAA BBB ← A,B列ともに同じなので重複行
AAC BBB ← A列は同じでないので重複ではない

以上が、重複行を排除する方法となります。