7.12.1 結合表の指定形式および規則
表の結合方法(直積,内結合,または外結合)を指定します。結合表は表参照中に指定します。
- 〈この項の構成〉
(1) 指定形式
結合表::={交差結合|修飾付き結合|(結合表)} 交差結合::=表参照 CROSS JOIN 表一次子 修飾付き結合::=表参照 〔{INNER|{LEFT|RIGHT|FULL} 〔OUTER〕}〕 JOIN 〔結合方式指定〕 表参照 結合指定 結合指定::=ON 探索条件
(2) 指定形式の説明
- ●交差結合
-
交差結合::=表参照 CROSS JOIN 表一次子
左側に指定した表参照と右側に指定した表一次子の直積を求める場合に指定します。表参照については,「7.11 表参照」を参照してください。表一次子については,「7.11.1 表参照の指定形式」を参照してください。
なお,問合せ指定の選択式に*を指定した場合,検索結果の列は左側の表参照の列,右側の表一次子の列の順に並びます。
交差結合の例を次に示します。
(例)
実行するSELECT文
SELECT * FROM "USERSLIST" CROSS JOIN "SALESLIST"
検索結果
USERSLISTの各行に対して,SALESLISTのすべての行を組み合わせます。
- ●修飾付き結合
-
修飾付き結合::=表参照 〔{INNER|{LEFT|RIGHT|FULL} 〔OUTER〕}〕 JOIN 〔結合方式指定〕 表参照 結合指定 結合指定::=ON 探索条件
内結合または外結合を行う場合に指定します。
INNER JOINを指定した結合を内結合といい,LEFT OUTER JOIN,RIGHT OUTER JOIN,またはFULL OUTER JOINを指定した結合を外結合といいます。
- 表参照:
-
結合の対象とする表または結合表を指定します。表参照については,「7.11 表参照」を参照してください。
問合せ指定の選択式に*を指定した場合,検索結果の列は左側の表参照の列,右側の表参照の列の順に並びます。例を次に示します。
(例)
- 〔INNER〕 JOIN:
-
左側と右側に指定した表参照の直積のうち,結合指定に指定した探索条件が真となる行を結合表の結果とします。
INNER JOINの例については,「7.12.2 INNER JOINを指定した内結合」を参照してください。
- LEFT 〔OUTER〕 JOIN:
-
次に示す行の和集合を結合表の結果とします。
-
左側と右側に指定した表参照の直積のうち,結合指定に指定した探索条件が真となる行(INNER JOINを指定したときの結果と同じ)
-
左側と右側に指定した表参照の直積のうち,結合指定に指定した探索条件が1つも真とならない左側の表参照の各行に対して,右側の表参照の結果をナル値とした行
LEFT OUTER JOINの例については,「7.12.3 LEFT OUTER JOINを指定した外結合」を参照してください。
-
- RIGHT 〔OUTER〕 JOIN:
-
次に示す行の和集合を結合表の結果とします。
-
左側と右側に指定した表参照の直積のうち,結合指定に指定した探索条件が真となる行(INNER JOINを指定したときの結果と同じ)
-
左側と右側に指定した表参照の直積のうち,結合指定に指定した探索条件が1つも真とならない右側の表参照の各行に対して,左側の表参照の結果をナル値とした行
RIGHT OUTER JOINの例については,「7.12.4 RIGHT OUTER JOINを指定した外結合」を参照してください。
-
- FULL 〔OUTER〕 JOIN:
-
次の行の和集合を結合表の結果とします。
-
左側と右側に指定した表参照の直積のうち,結合指定に指定した探索条件が真となる行(INNER JOINを指定したときの結果と同じ)
-
左側と右側に指定した表参照の直積のうち,結合指定に指定した探索条件が1つも真とならない左側の表参照の各行に対して,右側の結果をナル値とした行
-
左側と右側に指定した表参照の直積のうち,結合指定に指定した探索条件が1つも真とならない右側の表参照の各行に対して,左側の結果をナル値とした行
FULL OUTER JOINの例については,「7.12.5 FULL OUTER JOINを指定した外結合」を参照してください。
-
- 結合方式指定:
-
両側に指定した表参照の結合方式を指定します。結合方式指定については,「7.13 結合方式指定」を参照してください。
なお,通常は結合方式指定を指定する必要はありません。結合方式指定を省略した場合,結合方式はHADBが自動的に決定します。
- 結合指定:
-
結合指定::=ON 探索条件
2つの表参照を結合するときの条件を指定します。
ON 探索条件:
探索条件を指定します。探索条件については「7.19 探索条件」を参照してください。
探索条件中の列指定は,次に示すどちらかの条件を満たす必要があります。
-
結合させる2つの表参照に含まれる列
-
外への参照列
外への参照列については,「7.3.1 副問合せの指定形式および規則」の「(4) 規則」の「(a) 副問合せ共通の規則」を参照してください。
探索条件中の列名を表指定で修飾する場合,相関名を指定した表の列は,相関名で修飾する必要があります。
FULL OUTER JOINを指定した結合表のON 探索条件に,副問合せは指定できません。
-
- ●(結合表)
-
表の結合順序を指定したい場合に,結合表を括弧で囲みます。
(3) 規則
-
LEFT OUTER JOINを指定した場合,右側の表参照の結果は非ナル値制約なし(ナル値を許す)となります。
-
RIGHT OUTER JOINを指定した場合,左側の表参照の結果は非ナル値制約なし(ナル値を許す)となります。
-
FULL OUTER JOINを指定した場合,両側の表参照の結果は非ナル値制約なし(ナル値を許す)となります。
-
SQL文中に指定できるFULL OUTER JOINの数は,最大63個になります。結合対象の表参照がビュー表の場合は,CREATE VIEW文で指定した問合せ式に基づいた内部導出表が適用されます。FULL OUTER JOINの最大数の規則は,この内部導出表に対して適用されます。
-
FULL OUTER JOINを指定した場合,導出表が作成されます。導出表の相関名はHADBサーバが自動的に次の形式で設定します。
##DRVTBL_xxxxxxxxxx
xxxxxxxxxxは,10桁の整数です。
-
FULL OUTER JOINの両側のどちらかの表参照に配列型の列を定義した表を指定する場合,その配列型の列は,そのFULL OUTER JOINのON 探索条件だけに指定できます。
-
FULL OUTER JOINの両側の表参照には,すべての列が配列型の列である表を指定できません。
-
表の結合方式にハッシュジョインが選択され,かつハッシュジョインにハッシュフィルタが適用される場合は,適切な大きさのハッシュフィルタ領域が必要になります。ハッシュフィルタ領域の大きさは,サーバ定義またはクライアント定義のadb_sql_exe_hashflt_area_sizeオペランドで指定します。
-
HADBサーバは,INNER JOINまたはCROSS JOINを等価なコンマ結合に変換してSQL文を実行することがあります。コンマ結合については,「7.5.1 FROM句の指定形式および規則」の「(2) 指定形式の説明」を参照してください。
(4) 例題
- 例題1(INNER JOINの例)
-
顧客表(USERSLIST)と販売履歴表(SALESLIST)から,商品コード(PUR-CODE)がP001の商品を購入したことがある顧客の一覧(顧客ID,名前)を,重複を除いて検索します。
SELECT DISTINCT "USERSLIST"."USERID","NAME" FROM "USERSLIST" INNER JOIN "SALESLIST" ON "USERSLIST"."USERID"="SALESLIST"."USERID" WHERE "SALESLIST"."PUR-CODE"='P001'
下線部分が結合表(内結合)の指定です。
- 例題2(LEFT OUTER JOINの例)
-
商品表(PRODUCTLIST)と販売履歴表(SALESLIST)から,2012年12月の商品ごとの販売合計数を求めます。
SELECT "PRODUCTLIST"."PUR-NAME",SUM("SALESLIST"."PUR-NUM") AS "SUM" FROM "PRODUCTLIST" LEFT OUTER JOIN "SALESLIST" ON "PRODUCTLIST"."PUR-CODE"="SALESLIST"."PUR-CODE" AND "SALESLIST"."PUR-DATE" BETWEEN DATE'2012-12-01' AND DATE'2012-12-31' GROUP BY "PRODUCTLIST"."PUR-NAME"
下線部分が結合表(外結合)の指定です。
- 例題3(RIGHT OUTER JOINの例)
-
商品表(PRODUCTLIST)と販売履歴表(SALESLIST)から,2012年12月の商品ごとの販売合計数を求めます。
SELECT "PRODUCTLIST"."PUR-NAME",SUM("SALESLIST"."PUR-NUM") AS "SUM" FROM "SALESLIST" RIGHT OUTER JOIN "PRODUCTLIST" ON "SALESLIST"."PUR-CODE"="PRODUCTLIST"."PUR-CODE" AND "SALESLIST"."PUR-DATE" BETWEEN DATE'2012-12-01' AND DATE'2012-12-31' GROUP BY "PRODUCTLIST"."PUR-NAME"
下線部分が結合表(外結合)の指定です。
- 例題4(FULL OUTER JOINの例)
-
顧客表(USERSLIST),商品表(PRODUCTLIST),および販売履歴表(SALESLIST)から,2012年12月に商品を購入した顧客と販売商品の組み合わせ一覧(顧客名,商品名)を,重複を除いて求めます。
-
購入実績のない顧客については,商品名(PUR-NAME)にナル値を格納します。
-
販売個数が0の商品については,顧客名(NAME)にナル値を格納します。
SELECT DISTINCT "USERSLIST"."NAME","PRODUCTLIST"."PUR-NAME" FROM ("USERSLIST" LEFT OUTER JOIN "SALESLIST" ON "USERSLIST"."USERID"="SALESLIST"."USERID" AND "SALESLIST"."PUR-DATE" BETWEEN DATE'2012-12-01' AND DATE'2012-12-31') FULL OUTER JOIN "PRODUCTLIST" ON "SALESLIST"."PUR-CODE"="PRODUCTLIST"."PUR-CODE"
下線部分が結合表(外結合)の指定です。
-
- 例題5(結合指定の探索条件に副問合せを指定した例)
-
商品表(PRODUCTLIST)と販売履歴表(SALESLIST)から,最も多くの数量を購入した顧客の一覧を,商品ごとに求めます。1個も購入されていない商品については,顧客ID(USERID)および販売個数(PUR-NUM)にナル値を格納します。
SELECT "G"."PUR-NAME","S"."USERID","S"."PUR-NUM" FROM "PRODUCTLIST" "G" LEFT JOIN "SALESLIST" "S" ON "G"."PUR-CODE"="S"."PUR-CODE" AND "S"."PUR-NUM"=( SELECT MAX("SMAX"."PUR-NUM") FROM "SALESLIST" "SMAX" WHERE "S"."PUR-CODE"="SMAX"."PUR-CODE" )
下線部分が結合表の指定です。