基本に戻ろう: 内部結合
参照元: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 —