第8回 結合(2) ※作成中
★[SAMPLE_A]TABLEに以下のデータが格納されていることを前提とします★
◇◇◇SAMPLE_A◇◇◇
┌───┬───┬────┐
│ID │PRICE │REMARKS │
├───┼───┼────┤
│000001│10 │A │
├───┼───┼────┤
│000002│20 │B │
├───┼───┼────┤
│000003│10 │C │
└───┴───┴────┘
◇◇◇◇◇◇◇◇◇◇
◇◇◇SAMPLE_B◇◇◇
┌───┬──┬──────┐
│ID │ITEM│REMARKS │
├───┼──┼──────┤
│000001│10 │あいうえお │
├───┼──┼──────┤
│000002│10 │かきく │
├───┼──┼──────┤
│000002│20 │ │※REMARKSはnull(次回説明予定)
├───┼──┼──────┤
│000003│30 │さしすせそさ│
└───┴──┴──────┘
◇◇◇◇◇◇◇◇◇◇
【外部結合】
外部結合はレコード同士を繋ぐ際に
結合条件を満たすレコードがない場合にも
核となるテーブルからのレコードが除外されない結合。
以下の種類がある
・左外部結合
・右外部結合
・完全外部結合
項目名を含めて例があまり良くないですが、
SAMPLEデータを変えない形でいきます。
>SELECT B.ID AS B_ID,B.ITEM,A.ID AS A_ID,A.PRICE
FROM SAMPLE_A A, SAMPLE_B B
WHERE B.ITEM = A.PRICE(+)
ORDER BY B.ID,B.ITEM
>SELECT B.ID AS B_ID,B.ITEM,A.ID AS A_ID,A.PRICE
FROM SAMPLE_A A RIGHT OUTER JOIN SAMPLE_B B
ON B.ITEM = A.PRICE
ORDER BY B.ID,B.ITEM
>SELECT B.ID AS B_ID,B.ITEM,A.ID AS A_ID,A.PRICE
FROM SAMPLE_A A, SAMPLE_B B
WHERE A.PRICE(+) = B.ITEM
ORDER BY B.ID,B.ITEM
>SELECT B.ID AS B_ID,B.ITEM,A.ID AS A_ID,A.PRICE
FROM SAMPLE_B B LEFT OUTER JOIN SAMPLE_A A
ON B.ITEM = A.PRICE
ORDER BY B.ID,B.ITEM
┌───┬──┬───┬───┐
│B_ID │ITEM│A_ID │PRICE │
├───┼──┼───┼───┤
│000001│10 │000001│10 │
├───┼──┼───┼───┤
│000001│10 │000003│10 │
├───┼──┼───┼───┤
│000002│10 │000001│10 │
├───┼──┼───┼───┤
│000002│10 │000003│10 │
├───┼──┼───┼───┤
│000002│20 │000002│20 │
├───┼──┼───┼───┤
│000003│30 │ │ │
└───┴──┴───┴───┘
(G)SAMPLE_BテーブルにあるITEM項目の'30'に対して、
SAMPLE_AテーブルのPRICE項目に'30'が存在しない、
という状態でもレコードが出力されるんだな
(P)内部結合であれば、出力されないレコードですね
(G)「(+)」はNULLが出てくるほうに付けるわけか。
「(+)」を使うのはOracleくらいか
(P)「LEFT OUTER」の場合は左側の表を基点として
右側の表を付ける感じですね。右側の表でNULLが出てくる
(G)外部結合の必要性がある場合、NULLというしるしは必要だな
◇◇◇SAMPLE_A◇◇◇
┌───┬───┬────┐
│ID │PRICE │REMARKS │
├───┼───┼────┤
│000001│10 │A │
├───┼───┼────┤
│000002│20 │B │
├───┼───┼────┤
│000003│10 │C │
└───┴───┴────┘
◇◇◇◇◇◇◇◇◇◇
◇◇◇SAMPLE_B◇◇◇
┌───┬──┬──────┐
│ID │ITEM│REMARKS │
├───┼──┼──────┤
│000001│10 │あいうえお │
├───┼──┼──────┤
│000002│10 │かきく │
├───┼──┼──────┤
│000002│20 │ │※REMARKSはnull(次回説明予定)
├───┼──┼──────┤
│000003│30 │さしすせそさ│
└───┴──┴──────┘
◇◇◇◇◇◇◇◇◇◇
【外部結合】
外部結合はレコード同士を繋ぐ際に
結合条件を満たすレコードがない場合にも
核となるテーブルからのレコードが除外されない結合。
以下の種類がある
・左外部結合
・右外部結合
・完全外部結合
項目名を含めて例があまり良くないですが、
SAMPLEデータを変えない形でいきます。
>SELECT B.ID AS B_ID,B.ITEM,A.ID AS A_ID,A.PRICE
FROM SAMPLE_A A, SAMPLE_B B
WHERE B.ITEM = A.PRICE(+)
ORDER BY B.ID,B.ITEM
>SELECT B.ID AS B_ID,B.ITEM,A.ID AS A_ID,A.PRICE
FROM SAMPLE_A A RIGHT OUTER JOIN SAMPLE_B B
ON B.ITEM = A.PRICE
ORDER BY B.ID,B.ITEM
>SELECT B.ID AS B_ID,B.ITEM,A.ID AS A_ID,A.PRICE
FROM SAMPLE_A A, SAMPLE_B B
WHERE A.PRICE(+) = B.ITEM
ORDER BY B.ID,B.ITEM
>SELECT B.ID AS B_ID,B.ITEM,A.ID AS A_ID,A.PRICE
FROM SAMPLE_B B LEFT OUTER JOIN SAMPLE_A A
ON B.ITEM = A.PRICE
ORDER BY B.ID,B.ITEM
┌───┬──┬───┬───┐
│B_ID │ITEM│A_ID │PRICE │
├───┼──┼───┼───┤
│000001│10 │000001│10 │
├───┼──┼───┼───┤
│000001│10 │000003│10 │
├───┼──┼───┼───┤
│000002│10 │000001│10 │
├───┼──┼───┼───┤
│000002│10 │000003│10 │
├───┼──┼───┼───┤
│000002│20 │000002│20 │
├───┼──┼───┼───┤
│000003│30 │ │ │
└───┴──┴───┴───┘
(G)SAMPLE_BテーブルにあるITEM項目の'30'に対して、
SAMPLE_AテーブルのPRICE項目に'30'が存在しない、
という状態でもレコードが出力されるんだな
(P)内部結合であれば、出力されないレコードですね
(G)「(+)」はNULLが出てくるほうに付けるわけか。
「(+)」を使うのはOracleくらいか
(P)「LEFT OUTER」の場合は左側の表を基点として
右側の表を付ける感じですね。右側の表でNULLが出てくる
(G)外部結合の必要性がある場合、NULLというしるしは必要だな
この記事へのコメント