R2 午後Ⅰ 問2 設問1 表の結合順序

LNRACさん  
(No.1)
穴埋め問題として、こういう感じのSQLが載っています。

SELECT  ...
FROM  会場,
        (SELECT  *  FROM  公演  ...)  AS  A1,
        LEFT  OUTER  JOIN  (SELECT  *  FROM  席種在庫  ...)  AS  A2
        USING(公演番号,  ...)
WHERE  ...
ORDER  BY  ...

でさて、これについて情報処理教科書の解説P.41に
「A1とA2を結合して」うんぬんという言葉があるのですが、
「会場とA1の直積である中間表」とA2が正しいということはないのでしょうか?
表の結合順序として、画一的に左側からなのではなく、
直積は後回しのようなルールがあるのでしょうか。

細かいところですが、よろしくお願いします。
2023.09.24 17:29
LNRACさん  
(No.2)
すみません修正。AS  A1,のカンマ不要です。
2023.09.24 17:33
GinSanaさん 
DB シルバーマイスター
(No.3)
Itzik Ben-Gan, Adam Machanic, Dejan Sarka, Kevin Farlee「T-SQL Querying (Developer Reference)」(2015)の図によるとデカルト積(直積、cross)→内部結合→外部結合の順に評価されるそうなので、「会場とA1の直積である中間表」とA2の外部結合であってます。
ただし、どこのオプティマイザでも、何が何でもこの通りに動くことは意味しません。

図は「sql - ON句がJOIN句よりも先に評価されるのは本当ですか? - スタック・オーバーフロー」の回答日時: 2017年4月2日 6:50のpgrhoの回答にあります
2023.09.24 19:20
LNRACさん  
(No.4)
Ginsana様
細かい悩みに手を差し伸べて下さって、ありがとうございます!

FROM においてテーブルを結合する順序については、
「複数テーブルの結合は、書いた順番通りに一個一個行われる」
という説があります。これまで私はそう承知していました。

そして、今回紹介して下さった情報では、
「デカルト積(直積、cross)→内部結合→外部結合の順に」とのこと。

問題から引用したSQLについては、左:デカルト積→右:外部結合 なので
「「会場とA1の直積である中間表」とA2の外部結合であってます。」
で一致したのですが、SQLが
FROM X LEFT OUTER JOIN Y, Z
であれば、
①YとZをクロス結合して中間表 ②X表と中間表を左外部結合
になるということでいいのでしょうか。
「単純に左から」説は、内部結合が続く場合であればその内部結合について、
ということなのでしょうか。

過去問を解いていてこの結合順のために困ったことは無く、
今回解説を見て「んん?」と思っただけなので、
深追いしてもしょうがないのかもしれませんが……。
2023.09.24 20:08
GinSanaさん 
DB シルバーマイスター
(No.5)
>FROM X LEFT OUTER JOIN Y, Z
カンマが許されるのはFROM句だけです。

Chapter 30 -- Searching with Joins
SQL-99 Complete, Really.
Cartesian-Filter Join II -- CROSS JOIN
As shown in our syntax diagram earlier, we could use the <keyword>s CROSS
JOIN instead of a comma in the FROM clause to get the same result:

デカルト フィルター結合 II -- CROSS JOIN
先ほどの構文図で示したように、<keyword> の CROSS を使用できます。
FROM 句でカンマの代わりに JOIN を使用すると、同じ結果が得られます。

<joined Table> ::=
<Table reference> CROSS JOIN <Table reference> |
<Table reference> [ NATURAL ] [ <join type> ] JOIN <Table reference>
   [ <join specification> ] |
( <joined Table> )

   <join type> ::=
   INNER |
   {LEFT | RIGHT | FULL} [ OUTER ] |
   UNION

   <join specification> ::=
   ON <search condition> |
   USING (join <Column name> [ {,join <Column name>} ... ])
のBNF記法の説明の通り、<Table reference>に対し複数指定は出来ない。
2023.09.24 20:49
GinSanaさん 
DB シルバーマイスター
(No.6)
この投稿は投稿者により削除されました。(2023.09.24 21:10)
2023.09.24 21:10
GinSanaさん 
DB シルバーマイスター
(No.7)
この投稿は投稿者により削除されました。(2023.09.24 21:20)
2023.09.24 21:20
GinSanaさん 
DB シルバーマイスター
(No.8)
この投稿は投稿者により削除されました。(2023.09.24 21:31)
2023.09.24 21:31
GinSanaさん 
DB シルバーマイスター
(No.9)
>FROM X LEFT OUTER JOIN Y, Z
>であれば、
>①YとZをクロス結合して中間表 ②X表と中間表を左外部結合
>になるということでいいのでしょうか。

これは、前提が構文として間違っているので、このままは答えられませんが、
FROM X LEFT OUTER JOIN Y CROSS JOIN Z
であれば、「T-SQL Querying (Developer Reference)」(2015)、少なくともSQLServerの理屈では①XとZのデカルト積、②XとZのデカルト積の中間表とYとの外部結合
(「T-SQL Querying (Developer Reference)」(2015)図のEntering FROMで必ずXが起点になる。First Table Operator Exists?でYES→Operator Type?でJOIN→1-J1のCartesian ProductでZとのデカルト積→Another Table Operator Exists?でYES→Operator Type?でJOIN→1-J3のAdd Outer RowsでYとの外部結合→Another Table Operator Exists?でNO)
が理屈としては正しいことになります。直感的ではないでしょうが・・・。

>「単純に左から」説は、内部結合が続く場合であればその内部結合について、
>ということなのでしょうか。
駆動表をただ単に左からくっつけているだけで結局SELECTの解釈にならない限り見えないからそうなんだろ、くらいの解釈で書いたんでしょうね。私もこの質問を見て調べるまではそうだと思ってました。ただ、これによって何か変わるか?と言われると、別に変わることはないです。豆知識くらいですね。
パフォーマンスが変わるだろ、と言われればまあ変わりますが、それを気にするんならそもそもデカルト積をやめろということがカウンターで真っ先に来ますから、なんも変わりません。
2023.09.24 21:31
GinSanaさん 
DB シルバーマイスター
(No.10)
①XとZのデカルト積、②XとZのデカルト積の中間表とYとの外部結合
とは書いたんですが、これでCROSS JOIN Z ON Y.HOGE = Z.HOGEとか入ってくると、まだYが登場してないじゃないか、ということでオプティマイザ的に順序が変わる可能性はあります。そういう意味では、何でも左から説はわかりやすくて優秀ですね。
2023.09.24 21:46
GinSanaさん 
DB シルバーマイスター
(No.11)
申し訳ない、図の解釈がおかしかった可能性があとで気づきました。

そもそものJOINの処理で、必ずデカルト積を求めてから絞りを必要に応じて入れて(内部結合)、外部結合なら列を足す
1.JOIN句のテーブルを評価し、直積を求める。(≒CROSS JOIN)
2.ON句の条件に該当しない行を除外する。
3. OUTER JOINである場合は必要な未結合の行を追加する。
pgrhoの回答より

だから、評価フローのJoin以下のフローは、crossだから優先とかそういうのじゃなさそうです。crossでonがなければデカルト積まで、インナーならデカルト積やってonで絞りがあるよ、とかそういう条件分岐のフローを意味していると解釈しないと、No.10の例示したやつの解釈がおかしくなる。
そういう解釈であれば、なんでも左から説があってることになります。
2023.09.24 22:17
LNRACさん  
(No.12)
日曜日の夜にゆっくりとなさりたいところ、本当にすみません。
ありがとうございます。

Ginsana様のレスを全て拝読した上で、私も追加調査してみました。

"Multiple Joins Work just like Single Joins" で検索して見つかる記事が、
「何でも左から説」を図入りで解説してくれています。
著者は Peter Avila という先生で、
肩書が "SQL Server Instructor" なので
信憑性は高いように見えます。

では三好先生のそれは何だったのかですが、
Ginsanaさんがおっしゃったようなオプティマイザ デフォルトの
解説だったのかもしれません。
"津島博士のパフォーマンス講座 - 25-1-tsushimahakase-dl-final.pdf"
という ORACLE のページでは、
「クロス結合を後回し クロス結合はコストが高くなるという考えから」
という話題を見つけました。

Itzik Ben-Gan, Adam Machanic, Dejan Sarka, Kevin Farlee「T-SQL Querying (Developer Reference)」(2015)
の図は興味深いので、URLを記録しておきます。
ありがとうございました。
2023.09.25 04:58

返信投稿用フォーム

スパム防止のためにスレッド作成日から30日経過したスレッドへの書込みはできません。

その他のスレッド


Pagetop