# INNER JOIN 演算

INNER JOINとは、明示的な結合句を記述することができる、JOIN 演算です。

#### 構文

    表式 [ INNER ] JOIN 表式 { ON 真偽式 }

ONに真偽式を記述することで、結合句が記述できます。

ON節にある式では、直接の表および、外部の問い合わせ文から、直接のSELECT文までの間にある表が可視です。 以下の例ではON節は直接の表を参照しています。

    SELECT *
    FROM SAMP.EMPLOYEE INNER JOIN SAMP.STAFF
    ON EMPLOYEE.SALARY < STAFF.SALARY

ON節では結合されていない表を参照することができます。また結合している表を参照しなくてもかまいません。(一般的には参照します。)

    -- EMP_ACTとEMPLOYEEという表を結合します。
    -- EMP_ACTという表より全列を選択して、
    -- EMPLOYEEという表より従業員の苗字(LASTNAME)をそれぞれの行に
    -- 加えます。
    SELECT SAMP.EMP_ACT.*, LASTNAME
         FROM SAMP.EMP_ACT JOIN SAMP.EMPLOYEE
         ON EMP_ACT.EMPNO = EMPLOYEE.EMPNO
    -- EMPLOYEEとDEPARTMENTという表を結合して、
    -- 1930年より前に生まれた(BIRTDATE)全ての従業員の、
    -- 従業員番号(EMPNO)、従業員の苗字(LASTNAME)、
    -- 部署番号(EMPLOYEEという表のWORKDEPTと、DEPARTMENTという表のDEPTNO)、
    -- 部署名(DEPTNAME)を選択する。
    SELECT EMPNO, LASTNAME, WORKDEPT, DEPTNAME
         FROM SAMP.EMPLOYEE JOIN SAMP.DEPARTMENT
         ON WORKDEPT = DEPTNO
         AND YEAR(BIRTHDATE) < 1930

    -- VALUES節から選択する問い合わせ(select文の一例)により値を"生成"する別の例
    -- この問い合わせにより、一行の情報を持つ"R1"と"R2"という2列の"x"という表を
    -- どのように導出するのか示す。
    SELECT *
    FROM (VALUES (3, 4), (1, 5), (2, 6))
    AS VALUESTABLE1(C1, C2)
    JOIN (VALUES (3, 2), (1, 2),
    (0, 3)) AS VALUESTABLE2(c1, c2)
    ON VALUESTABLE1.c1 = VALUESTABLE2.c1
    -- This results in:
    -- C1         |C2         |C1         |2
    -- -----------------------------------------------
    -- 3          |4          |3          |2
    -- 1          |5          |1          |2

    -- 全ての部署を、管理者の苗字と従業員番号と共に一覧する。

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

    -- 全ての従業員の従業員番号と苗字を、
    -- その管理者の従業員番号と苗字と共に一覧する。
    SELECT E.EMPNO, E.LASTNAME, M.EMPNO, M.LASTNAME
    	FROM EMPLOYEE E INNER JOIN
    	DEPARTMENT INNER JOIN EMPLOYEE M
            ON MGRNO = M.EMPNO
            ON E.WORKDEPT = DEPTNO

親トピック: JOIN 演算