« 基本に戻ろう: クロス結合
基本に戻ろう: 外部結合 »


5月

27

基本に戻ろう: 内部結合

参照元:Back to basics: inner joins < Eddie Awad’s Blog

— beginning of translation —

この記事はOracle結合シリーズの一つです。

目次:

1.基本に戻ろう: クロス結合
2.基本に戻ろう: 内部結合
3.基本に戻ろう: 外部結合
4.基本に戻ろう: 等価結合と非等価結合
5.基本に戻ろう: 自己結合
6.基本に戻ろう: アンチジョインとセミジョイン

結合シリーズを続けるにあたり、今回は内部結合について解説します。内部結合(単純結合としても知られる)は2つ以上の表を結合し、その結合条件を満たす行のみを返す結合方法です。一般的に、結合と言うときは内部結合を指します。

例えば:

create table dept (

    dept_id number primary key,

    dept_name varchar2(100))

/

create table emp (

    emp_id number primary key,

    emp_name varchar2(100),

    dept_id number,

    foreign key (dept_id)

    references dept(dept_id)

)

/

insert into dept values (1, 'HR')

/

insert into dept values (2, 'IT')

/

insert into emp values (1, 'King', null)

/

insert into emp values (2, 'Eddie', 2)

/

この2つの表を古い構文を使用して結合した場合:

select emp.emp_name, dept.dept_name

from emp, dept

where emp.dept_id = dept.dept_id

新しい構文を使用した場合:

select emp.emp_name, dept.dept_name

from emp INNER JOIN dept

ON emp.dept_id = dept.dept_id

キーワード「JOIN」のデフォルト値は「INNER」なので、上記例で「INNER」の記述は任意です。

emp表とdept表を結合する列の名前が両方の表で同一のため、キーワード「USING」を使うことができます:

select emp.emp_name, dept.dept_name

from emp INNER JOIN dept

USING (dept_id)

しかし、結合列を選択リストに含める場合、選択リストの列名を表名で修飾しないよう注意が必要です。下記の場合:

select dept.dept_id, emp.emp_name, dept.dept_name

from emp INNER JOIN dept

USING (dept_id)

このエラーが返されます:

ORA-25154: USING句の列の部分には修飾子を持てません。

また、NATURAL JOIN句を使う「自然結合」という結合方法もあります。自然結合を使うことによって、結合条件を明記する必要がなくなります。自然結合は各テーブルで同名の列を結合します。例えば、dept_id列はemp表とdept表で同じ名前が付けられているので、下記のSQL文は有効であり、emp表とdept表を暗黙的に結合しています。:

select emp.emp_name, dept.dept_name

from emp NATURAL JOIN dept

「USING」と同じく、結合列を選択列として返す場合は、選択リストの列名を表名で修飾してはいけません。下記は有効なSQL文です:

select dept_id, emp.emp_name, dept.dept_name

from emp NATURAL JOIN dept

しかし「dept_id」ではなく「dept.dept_id」とした場合、このエラーが返されます。:

ORA-25155: NATURAL結合で使用される列は修飾子を持てません。

最後に、「USING」や 「NATURAL JOIN」よりも「INNER JOIN…ON」を使った方がどの列を結合しているか明確なため、私は「INNER JOIN…ON」の方を好んで使います。

次は外部結合について解説します…

— end of translation —

Leave a Reply

Comment