結合のある副選択照会の例

以下の例は、副選択照会における結合の使用法を示しています。

  • 例 1: この例では、表 J1 および J2 を使用した種々の結合の結果を示しています。これらの表には、以下の行が入っています。
       SELECT * FROM J1
    
       W   X     
       --- ------
       A       11
       B       12
       C       13
    
       SELECT * FROM J2
    
       Y   Z     
       --- ------
       A       21
       C       22
       D       23

    以下の照会では、両方の表の最初の列が一致する J1 および J2 の内部結合を行っています。

       SELECT * FROM J1 INNER JOIN J2 ON W=Y
    
       W   X      Y   Z     
       --- ------ --- ------
       A       11 A       21
       C       13 C       22

    この内部結合の例では、J1 の列 W='C' の行および J2 の列 Y='D' の行が、 結果に入っていません。 これは、これらの行がもう一方の表に一致するものがないからです。 次のような代替形式の内部結合照会で同じ結果が生成されることに注意してください。

       SELECT * FROM J1, J2 WHERE W=Y

    以下の左外部結合では、J2 の列が NULL 値である J1 の欠落行を戻します。 J1 のすべての行が組み入れられます。

       SELECT * FROM J1 LEFT OUTER JOIN J2 ON W=Y
    
       W   X      Y   Z     
       --- ------ --- ------
       A       11 A       21
       B       12 -        -
       C       13 C       22

    以下の右外部結合では、J1 の列が NULL 値である J2 の欠落行を戻します。 J2 のすべての行が組み入れられます。

       SELECT * FROM J1 RIGHT OUTER JOIN J2 ON W=Y
    
       W   X      Y   Z     
       --- ------ --- ------
       A       11 A       21
       C       13 C       22
       -        - D       23

    以下の全外部結合では、適切な場合 NULL 値となっている J1 と J2 の両方の欠落行を戻します。 J1 と J2 の両方のすべての行が組み入れられます。

       SELECT * FROM J1 FULL OUTER JOIN J2 ON W=Y
    
       W   X      Y   Z     
       --- ------ --- ------
       A       11 A       21
       C       13 C       22
       -        - D       23
       B       12 -        -
  • 例 2: 上記の例の表 J1 および J2 を使用して、述部が検索条件に追加されるとどうなるかを調べます。
       SELECT * FROM J1 INNER JOIN J2 ON W=Y AND X=13
    
       W   X      Y   Z     
       --- ------ --- ------
       C       13 C       22

    条件を追加すると、内部結合は、例 1 の内部結合と比較して 1 行のみを選択します。

    全外部結合に対するこの影響に注意してください。

       SELECT * FROM J1 FULL OUTER JOIN J2 ON W=Y AND X=13
    
       W   X      Y   Z     
       --- ------ --- ------
       -        - A       21
       C       13 C       22
       -        - D       23
       A       11 -        -
       B       12 -        -

    内部結合には 1 行のみがあり、両方の表のすべての行を戻す必要があるため、結果は (追加の述部がない場合は 4 行になるのに対し) 5 行になります。

    以下の照会では、同じ述部を WHERE 節に追加することにより、 まったく異なる結果を生成される場合を示しています。

       SELECT * FROM J1 FULL OUTER JOIN J2 ON W=Y 
          WHERE X=13
    
       W   X      Y   Z     
       --- ------ --- ------
       C       13 C       22

    WHERE 節は、全外部結合の中間結果の後に適用されます。 この中間結果は、例 1 の全外部結合照会の結果と同じになります。WHERE 節は、この中間結果に適用され、X=13 の行を除くすべての行を除去します。 外部結合を行う場合に、述部の位置の選択によって、 結果に大きな影響を与える可能性があります。 述部が X=13 ではなく X=12 であるとどうなるかを考えてみます。 以下の内部結合は行を戻しません。

       SELECT * FROM J1 INNER JOIN J2 ON W=Y AND X=12

    したがって、全外部結合は 6 行を返します。 つまり、J2 の列が NULL 値である J1 の 3 行と、J1 の列が NULL 値である J2 の 3 行です。

       SELECT * FROM J1 FULL OUTER JOIN J2 ON W=Y AND X=12
    
       W   X      Y   Z     
       --- ------ --- ------
       -        - A       21
       -        - C       22
       -        - D       23
       A       11 -        -
       B       12 -        -
       C       13 -        -

    追加の述部が WHERE 節にある場合には、1 行が戻されます。

       SELECT * FROM J1 FULL OUTER JOIN J2 ON W=Y 
          WHERE X=12
    
       W   X      Y   Z     
       --- ------ --- ------
       B       12 -        -
  • 例 3: 管理者のいない部門も含めて、すべての部門を従業員番号と管理者の姓と共にリストします。
      SELECT DEPTNO, DEPTNAME, EMPNO, LASTNAME
        FROM DEPARTMENT LEFT OUTER JOIN EMPLOYEE
             ON MGRNO = EMPNO
  • 例 4: 管理者のいない従業員も含めて、すべての従業員の番号と姓を管理者の従業員番号と姓と共にリストします。
      SELECT E.EMPNO, E.LASTNAME, M.EMPNO, M.LASTNAME
        FROM EMPLOYEE E LEFT OUTER JOIN
                                            DEPARTMENT INNER JOIN EMPLOYEE M 
             ON MGRNO = M.EMPNO
             ON E.WORKDEPT = DEPTNO

    内部結合は、DEPARTMENT 表で識別されるすべての管理者の姓を判別し、左外部結合によって、 対応する部門が DEPARTMENT にない場合であっても各従業員を必ずリストすることができます。