【SQL – Oracle】ON句を使用した結合

【SQL – Oracle】ON句を使用した結合

ON句を使用した結合について

 自然結合やUSING句を使用した結合では「2つの表にある同じ名前の列」を使用して表の結合が行われますが、ON句を使用した結合では、異なる名前の列を使用して表を結合することもできます(もちろん、同じ名前の列を使用することもできます)。
 ON句を使用した結合では、ON句に続いて結合条件を指定します。結合条件以外の条件はWHERE句に指定します。

▼ ON句を使用した結合の構文
  SELECT [表名.]列名 [, [表名. ]列名 …]
  FROM 表名1 JOIN 表名2
  ON [表名1.]列名 = [表名2.]列名
  [WHERE 結合条件以外の条件];

※NATURAL JOIN句やUSING句は等価結合でしか使用されませんが、ON句は、「非等価結合」や「自己結合」などでも使用される汎用的かつ重要な構文です。

 以下の例では、DEPTNO列を結合列に指定して、EMPLOYEES表とDEPARTMENTS表を結合しています。実行結果は自然結合やUSING句を使用した結合の場合と同じです。

▼ ON句を使用した結合

SQL> SELECT empno, ename, dname
 2  FROM employees JOIN departments 
 3  ON   employees.deptno = departments.deptno;

EMPNO   ENAME    DNAME      
------ -------  ----------- 
1001    佐藤      管理        
1002    鈴木      研究開発        
1003    高橋      管理        
(省略)
1013    山田      研究開発        
1014    佐々木    管理        

14行が選択されました。

■ 表接頭辞を使用した同じ名前の列の修飾
 前記事で自然結合やUSING句を使用した結合では、結合列に表接頭辞を使用することはできませでしたが、ON句を使用した結合では、2つの表にある同じ名前の列をSELECT句やWHERE句などで使用する場合は表接頭辞を使用して列名を修飾する必要があります。この点もON句を使用した結合の特徴の1つなので必ず覚えましょう。
 以下の例では、ON句を使用してEMPLOYEES表とDEPARTMENTS表をを結合しています。DEPTNO列はこれらの表に共通して存在するので、表接頭辞を使用して列名を修飾する必要があります。

▼ ON句を使用した結合における表接頭辞を使用した列名の修飾(1)

SQL> SELECT e.empno, e.ename, d.dname, e.deptno
 2  FROM employees e JOIN departments d
 3  ON   e.deptno = d.deptno
 4  WHERE e.deptno IN (10, 20);

EMPNO   ENAME    DNAME       DEPTNO
------ -------  ----------  --------
1001    佐藤      管理            10
1002    鈴木      研究開発        20
1005    渡辺      研究開発        20
1008    中村      管理            10
1009    小林      研究開発        20
1011    加藤      研究開発        20
1013    山田      研究開発        20
1014    佐々木    管理            10

8行が選択されました。

 以下の例のように、DEPTNO列をそのまま指定すると、OracleサーバーはどちらのDEPTNO列を表示するのか判断できないためエラーがになります。

▼ ON句を使用した結合における表接頭辞を使用した列名の修飾(2)

SQL> SELECT e.empno, e.ename, d.dname
 2  FROM employees e JOIN departments d
 3  ON   e.deptno = d.deptno
 4  WHERE deptno IN (10, 20);
           *
行4でエラーが発生しまいた。:
ORA-00918: 列の定義が未確定です。

 

まとめ

▼ ON句を使用した結合では、結合条件はON句に指定する
▼ ON句を使用した結合では、名前の異なる列を使用して表を結合することができる
▼ ON句を使用した結合では、同じ名前の列がある場合、表接頭辞で修飾する必要がある

コメントを残す