SQL 解説書

結合の例

例 B1: この例では、表 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 の列がヌル値である 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 の列がヌル値である 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

以下の全外部結合では、ヌル値である 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 -        -

例 B2: 上記の例の表 J1 および J2 を使用して、 述部が検索条件に追加されるとどうなるかを調べます。

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

条件を追加すると、内部結合は、 例 B1 の内部結合と比較して 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 行のみがあり、両方の表のすべての行を戻す必要があるため、 結果は 5 行になります (追加の述部がない場合の 4 行と比較して)。

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

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

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

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

したがって、全外部結合は 6 行を返します。 つまり、J2 の列がヌル値である J1 の 3 行と、J1 の列がヌル値である 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 -        -

例 B3: 管理者のいない部門も含めて、すべての部門を従業員番号と管理者の姓と共にリストします。

    SELECT DEPTNO, DEPTNAME, EMPNO, LASTNAME
    FROM DEPARTMENT LEFT OUTER JOIN EMPLOYEE
         ON MGRNO = EMPNO

例 B4: 管理者のいない従業員も含めて、 すべての従業員の番号と姓を管理者の従業員番号と姓と共にリストします。

    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 にない場合であっても各従業員がリストされていることが保証されます。


[ ページのトップ | 前ページ | 次ページ | 目次 | 索引 ]