R3午後1問3設問2(1)

ビックマックさん  
(No.1)
R3午後1問3設問2(1)のinnerJOINについてです。
解説には「当然内部結合」のようなことしか書いておらず、理解できなかったのですが、なぜこの場合は内部結合なのでしょうか?
また、外部結合する場合と、内部結合する場合の違いについて教えていただきたいです。
(ちなみにLEFT OUTER JOINと回答していました…)
SQLは得意ではないので、この場合はこう!みたいな必勝法(?)などあれば追加で教えていただきたいです、よろしくお願いします
2024.09.18 09:00
GinSanaさん 
DB ゴールドマイスター
(No.2)
>解説には「当然内部結合」のようなことしか書いておらず、理解できなかったのですが、なぜこの場合は内部結合なのでしょうか?

なんかそういうとこがありますね、読まなくても三好だな、と一瞬でわかる感じです。
まず、内部結合の場合は、よく振り落とすために使う、という説明をします。Aを基準に、Bを参照して、どっちにもあるものだけを生き残らせる、という感じで。
外部結合は、さっきの場合だとBにない要素のAのレコードは振り落とされてやられちゃうので、それじゃ困るんだよねえ、ということで使うんですが、もしAのあるレコードがBと結び付くやつがいなくても、
A.列a、A.列b、B.列c、B.列d
で、
hoge、fuga、null、null
のように残ってくれます。
で、選択の優先度は
クロスジョイン
インナージョイン
レフトジョイン
の順に選びます。どれでもよければ最悪クロスジョインでいいわけです。
直積といって、どのジョインでも必ず手順的には最初クロスジョイン同様、レコードとレコードの掛け算をして、全パターンを作り出します。
で、内部結合で、onの条件に合うやつだけを残します。外部結合の場合、onの条件に合わないやつは特別に駆動表(レフトジョインの次に書くテーブル名)の中身がnullだった扱いでくっついた体でデータを結合してくれます、というのが一般的な結合の流れです。たまにそういう決まりがANSIにあるんですかと茶々をいれるやつがいますが、気にしないでください。少なくともSQL ServerのTransact-SQLを例にするとそういう理屈です。


で、新物件を基準に、物件設備と設備があるやつを残したいわけですよね。
たとえば、物件設備で新物件の沿線が○△線のやつだけにしたい、という理由でやってんのに、外部結合にしたら、新物件の沿線が○△線じゃないレコードまで物件設備の列の値がnullとして残っちゃうわけです。それじゃ困るよね、というわけで、内部結合なわけです。
要は、外部結合を選ぶには、残さないとならない理由があるか?をまず心に問いましょう。なければ振り落としていいのだから、内部結合なのです。
2024.09.18 14:13
ビックマックさん  
(No.3)
Ginsanaさん、ありがとうございます!

まさに、ご名答でございます。

>物件設備で新物件の沿線が○△線のやつだけにしたい、という理由でやってんのに、外部結合にしたら、新物件の沿線が○△線じゃないレコードまで物件設備の列の値がnullとして残っちゃうわけです。それじゃ困るよね、というわけで、内部結合なわけです。

こちら、sql6の3行目において、新物件の絞込み条件として「B.沿線=〇△線」と絞込みがされているため、
1.新物件において 沿線=〇△線 の行が抽出
2.それを基準の表として、物件コードを結合条件とし
物件設備を結合(left outer join)
だと思っていたのですが、そもそも考え方が間違っているでしょうか?
もしくは、先に新物件と物件設備を外部結合しても、新物件にて「沿線=〇△線」の条件による絞込みが行われるので問題ないのでは?と思ってしまいます。

試験においてはあまり考えすぎず、振り落としが必要かどうか、だけを考えてスピード勝負した方がいいのでしょうか…
2024.09.18 19:42
GinSanaさん 
DB ゴールドマイスター
(No.4)
この投稿は投稿者により削除されました。(2024.09.18 21:38)
2024.09.18 21:38
GinSanaさん 
DB ゴールドマイスター
(No.5)
>こちら、sql6の3行目において、新物件の絞込み条件として「B.沿線=〇△線」と絞込みがされているため、
>1.新物件において 沿線=〇△線 の行が抽出
>2.それを基準の表として、物件コードを結合条件とし
>物件設備を結合(left outer join)
>だと思っていたのですが、そもそも考え方が間違っているでしょうか?

1.新物件と物件設備の直積(これを、一般にデカルト積というが、試験に出ないので名前は忘れていいです)を取ります
2.1.で取得した掛け算のレコードに対し、on条件である「物件コードが一緒で新物件の沿線が○△線」のレコード「だけ」を残します
3.2.の最終的なレコードの集合(中間テーブルと考えていいです)と、設備のデカルト積をとります
4.3.で取得した掛け算のレコードに対し、「設備コードが一緒で設備コードがA1(空欄hですが説明は省きます)のレコード「だけ」を残します
以下略

先程も述べたように、仮に外部結合の場合はこうなります。

1.新物件と物件設備のデカルト積を取ります
2.1.で取得した掛け算のレコードに対し、on条件である「物件コードが一緒で新物件の沿線が○△線」のレコード「は」まともに結合されます。
それ以外の「結び付かなかった」新物件のレコード(=物件コードが不一致、または新物件の沿線が○△線でない)は、物件設備の列の値がnullで生き残ります。
3.2.の最終的なレコードの集合と、設備のデカルト積をとります。
4.3.で取得した掛け算のレコードに対し、「設備コードが一緒で設備コードがA1のレコード「は」まともに結合されます。
それ以外の「結び付かなかった」新物件のレコード(=設備コードが不一致、または設備コードがA1でない)は、設備の列の値がnullで生き残ります。
以下略

そうなると、レコードの数が膨らみすぎるのはわかりますよね。
必要なレコードって、
沿線が○△線
かつ
エアコン付き
かつ
オートロック付きの物件
なわけで、それ以外はゴミなんです。
外部結合の場合は、ゴミレコードがそれだけ出来るわけですよ。
そのあとwhere句で絞るならまだわかりますけど(まあ、そこで絞るくらいなら最初から結合段階でやれよ、となりますけどね)、表6にwhere句ないので。
2024.09.18 21:38
みかんさん 
DB ブロンズマイスター
(No.6)
> SQLは得意ではないので、この場合はこう!みたいな必勝法(?)などあれば追加で教えていただきたいです、よろしくお願いします

  そもそも、まず、内部結合が成立すると仮説を立てましたか?仮説を立てて検証した結果、不成立と判断したのかしら?外部結合の仮説を立てて検証するのは、その後になるのではないかしら?
  また、どちらでも成立する場合、外部結合は別解として認められるでしょうか?内部結合が成立しないと判断した、と見做されると思います。つまり、不正解の憂き目にあっても文句は言えないでしょう。
2024.09.19 01:34
ビックマックさん  
(No.7)
Ginsanaさん
>外部結合の場合は、ゴミレコードがそれだけ出来るわけですよ。
ゴミレコードができてしまうかどうか、判断できるようになるまで丁寧にsqlを読むように練習しようと思います…ありがとうございます!


みかんさん
>そもそも、まず、内部結合が成立すると仮説を立てましたか?
まず内部結合の成立可否を考えた上で外部結合の可能性が初めてうまれてくる、ということですね
以降そのように問題を見ていくことにします!
2024.09.19 21:14

返信投稿用フォーム

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

その他のスレッド


Pagetop