内部結合 |
BASE と OPTION の内部結合の結果を以下に示します。 (下部に SQL を記す)
ID |
NAME |
AGE |
EXT |
UPDATE |
NICKNAME |
2 |
じろう |
35 |
5002 |
1 |
じー |
3 |
さぶろう |
26 |
5003 |
1 |
サブちゃん |
3 |
さぶろう |
26 |
5003 |
2 |
サブブ |
select BASE.ID,
BASE.NAME,
BASE.AGE,
BASE.EXT,
EXINFO.CLASSUP,
EXINFO.NICKNAME
from BASE
join EXINFO on BASE.EXT=EXINFO.EXT
; |
以下に内部結合のルールを示します。また、ルールによる動きを右に示します。
・ |
内部結合の場合 FROM 文で指定したテーブルを基準に結合する。 |
BASE テーブルが基準。 |
・ |
結合条件の列の値が一致するレコード同士を結合する。 |
BASE テーブルのレコード 2 と 3 の 5002 と 5003 が OPTION テーブルに存在。よって以下のようになる。
- BASE テーブルのレコード 2 と OPTION テーブルのレコード 2 を結合。
- (BASE テーブルのレコード 3 は次のルールを参照)
|
・ |
結合条件の列の値が複数一致する場合、それぞれと結合する。 |
EXINFO テーブルのレコード 3 ~ 4 と BASE テーブルのレコード 3 をそれぞれ結合。よって以下のようになる。
- EXINFO テーブルのレコード 3 と BASE テーブルのレコード 3 を結合。
- EXINFO テーブルのレコード 4 と BASE テーブルのレコード 3 を結合。
|
・ |
結合条件の列の値が NULL もしくは一致するレコードが存在しない場合は除外する。 |
- BASE テーブルのレコード 1 は EXT が NULL のため除外。
- BASE テーブルのレコード 4 の EXT 5004 は OPTION テーブルの EXT 列には存在しないため除外。
|
|
左 外部結合 |
BASE と OPTION の左外部結合の結果を以下に示します。 (下部に SQL を記す)
ID |
NAME |
AGE |
EXT |
UPDATE |
NICKNAME |
2 |
じろう |
35 |
5002 |
1 |
じー |
3 |
さぶろう |
26 |
5003 |
1 |
サブちゃん |
3 |
さぶろう |
26 |
5003 |
2 |
サブブ |
1 |
いちろう |
48 |
(NULL) |
(NULL) |
(NULL) |
4 |
しろう |
18 |
5004 |
(NULL) |
(NULL) |
select BASE.ID,
BASE.NAME,
BASE.AGE,
BASE.EXT,
EXINFO.CLASSUP,
EXINFO.NICKNAME
from BASE
left join EXINFO on BASE.EXT=EXINFO.EXT
;
|
以下に左外部結合のルールを示します。また、ルールによる動きを右に示します。
・ |
外部結合(左)の場合 FROM 文で指定したテーブルを基準に結合する。 |
BASE テーブルが基準。 |
・ |
結合条件の列の値が一致するレコード同士を結合する。 |
BASE テーブルのレコード 2 と 3 の 5002 と 5003 が OPTION テーブルに存在。よって以下のようになる。
- BASE テーブルのレコード 2 と OPTION テーブルのレコード 2 を結合。
- (BASE テーブルのレコード 3 は次のルールを参照)
|
・ |
結合条件の列の値が複数一致する場合、それぞれと結合する。 |
OPTION テーブルには EXT 5003 が 2 レコード存在。よって以下のようになる。
- BASE テーブルのレコード 3 と OPTION テーブルのレコード 3 を結合。
- BASE テーブルのレコード 3 と OPTION テーブルのレコード 4 を結合。
|
・ |
結合条件の列の値が NULL でも結合する。結合するレコードの列は全て NULL のレコード。 |
- BASE テーブルのレコード 1 は EXT が NULL のため列が全て NULL のレコードと結合。
- BASE テーブルのレコード 4(EXT 5004)は OPTION テーブルの EXT 列に存在しないため列が全て NULL のレコードと結合。
|
|
右・外部結合 |
BASE と OPTION の右外部結合の結果を以下に示します。 (下部に SQL を記す)
ID |
NAME |
AGE |
EXT |
UPDATE |
NICKNAME |
2 |
じろう |
35 |
5002 |
1 |
じー |
3 |
さぶろう |
26 |
5003 |
1 |
サブちゃん |
3 |
さぶろう |
26 |
5003 |
2 |
サブブ |
(NULL) |
(NULL) |
(NULL) |
5001 |
1 |
イチ |
select BASE.ID,
BASE.NAME,
BASE.AGE,
BASE.EXT,
EXINFO.CLASSUP,
EXINFO.NICKNAME
from BASE
right join EXINFO on BASE.EXT=EXINFO.EXT
;
|
以下に外部結合(右)のルールを記す。
- 結合条件に指定した列が一致するレコード同士を結合する。(この例の場合、EXT 列)
- 結合条件の列の値が複数存在する場合、それぞれと結合する。(この例の場合、EXT が 5003 の 2 レコードがそれぞれ結合する)
- 結合条件の列が NULL でも結合する。存在しない ID と NAME、AGE は NULL となる。(この例の場合、EXT が 5001)
・ |
右外部結合の場合 JOIN 文で指定したテーブルを基準に結合する。 |
EXINFO テーブルが基準。 |
・ |
結合条件の列の値が一致するレコード同士を結合する。 |
EXINFO テーブルのレコード 2 ~ 4 の 5002 と 5003 が BASE テーブルに存在。よって以下のようになる。
- EXINFO テーブルのレコード 2 と BASE テーブルのレコード 2 を結合。
- EXINFO テーブルのレコード 3 と BASE テーブルのレコード 3 を結合。
- EXINFO テーブルのレコード 4 と BASE テーブルのレコード 3 を結合。
|
・ |
結合条件の列の値が複数一致する場合、それぞれと結合する。 |
OPTION テーブルには EXT 5003 が 2 レコード存在。よって以下のようになる。
- BASE テーブルのレコード 3 と OPTION テーブルのレコード 3 を結合。
- BASE テーブルのレコード 3 と OPTION テーブルのレコード 4 を結合。
|
・ |
結合条件の列の値が NULL でも結合する。結合するレコードの列は全て NULL のレコード。 |
- BASE テーブルのレコード 1 は EXT が NULL のため列が全て NULL のレコードと結合。
- BASE テーブルのレコード 4(EXT 5004)は OPTION テーブルの EXT 列に存在しないため列が全て NULL のレコードと結合。
|
|
左・外部結合 & 特定レコードに絞り込む |
ID |
NAME |
AGE |
EXT |
UPDATE |
NICKNAME |
2 |
じろう |
35 |
5002 |
1 |
じー |
3 |
さぶろう |
26 |
5003 |
2 |
サブブ |
(NULL) |
(NULL) |
(NULL) |
(NULL) |
1 |
イチ |
with
in2 as (select EXT,
max(CLASSUP) CLASSUP
from EXINFO
group by EXT),
in3 as (select EXINFO.EXT,
EXINFO.CLASSUP,
EXINFO.NICKNAME
from EXINFO
join in2 on EXINFO.EXT=in2.EXT
and EXINFO.CLASSUP=in2.CLASSUP)
select BASE.ID,
BASE.AGE,
BASE.EXT,
in3.CLASSUP,
BASE.NAME,
in3.NICKNAME
from BASE
right join in3 on BASE.EXT=in3.EXT
;
|
|