• ベストアンサー

SQL文について(結合に関する質問)

図2出荷実績表のレコード様式 ------------------------------------------ 伝票番号|構成部品番号|構成部品名|出荷個数| ------------------------------------------ 図3構成関係表のレコード様式 ----------------------------------- 部品セット番号|構成部品番号|構成数| ----------------------------------- 図4部品関係表のレコード様式 ------------------------- |構成部品番号|構成部品名| ------------------------- 図5部品セット関係表のレコード様式 ------------------------------------- 伝票番号|部品セット番号|部品セット数| ------------------------------------- 上記の表から図3,4,5を用いて、図2の表をSQL文より抽出するときに SELECT 伝票番号 , 部品関係表.構成部品番号 , 構成部品名 , 部品セット数 * 構成数 AS 出荷個数 FROM 構成関係表 , 部品関係表 , 部品セット関係表 WHERE 構成関係表.部品セット番号 = 部品セット関係表.部品セット番号  AND 構成関係表.構成部品番号 = 部品関係表.構成部品番号                                   を使うことになります。 ここで、ANDの部分になりますが、これについてはORになるのではと思っております。 ANDで取ると、各表に部品セット番号と構成部品番号の項目がなければ図2は抽出されないと思われます。 ORでは部品セット番号と構成部品番号の項目がいずれか一方にあれば、結合できるため SQLが抽出されると思われます。 以上、ご教授の程お願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • ymmasayan
  • ベストアンサー率30% (2593/8599)
回答No.4

No.2、No.3です。回答します。 > (1)構成関係表の部品セット番号と部品セット関係表.部品セット番号を結合。 > かつ(AND) > (2)構成関係表の構成部品番号と部品関係表の構成部品番号を結合 が混乱の元です。 「結合」ではなく「比べて等しい」と読む必要があります。 結合はこの前に終わっています。 細かく書くと次の表を作ります。ちょっと長いですがここが結合です。 構成関係表.部品セット番号|構成関係表.構成部品番号|構成関係表.構成数 |部品関係表.構成部品番号|部品関係表.構成部品名 |部品セット関係表.伝票番号|部品セット関係表.部品セット番号|部品セット関係表.部品セット数| 次に 構成関係表.部品セット番号 = 部品セット関係表.部品セット番号 と  構成関係表.構成部品番号 = 部品関係表.構成部品番号 が同時に「成立」している行を抽出するのです。

KGM
質問者

お礼

やっとわかりました!! 本当に親切なコメントありがとうございます。 ER図とこのコメントを交えると、一発でわかります。 本当にありがとうございました。

その他の回答 (4)

  • kagep
  • ベストアンサー率23% (171/721)
回答No.5

#4の方の回答がすべてです。 ER図とか書いてみたらどうでしょう? よくわかると思いますよ。 リレーショナルが理解できれば一発です あと、図2の表を抽出するSQL文のSELECT句 『SELECT 伝票番号 , 部品関係表.構成部品番号 , 構成部品名 , 部品セット数 * 構成数 AS 出荷個数』 に、それぞれの項目の抽出元テーブル名をきちんと書けばなおわかりやすいです。 とにもかくにも、ER。 これがきちんと理解できれば 「一つの表に、「部品セット」と「構成部品番号」の 両方がなければ、紐付けができないと思われます。」 という疑問は生まれないはずです。

KGM
質問者

お礼

ER図のお陰で理解できました。 非常にためになるアドバイスをありがとう ございました^^

  • ymmasayan
  • ベストアンサー率30% (2593/8599)
回答No.3

No.2です。回答します。 > ここで使うANDは論理積の意味で使われているものでは > ないのでしょうか?? 論理積と考えてもいいですし、単に「かつ」と考えてもいいでしょう。 要は自分の判りやすい方で理解すればいいですね。 > 自分的には内部結合して、抽出されるイメージが あるのですが、 > それとは違うのでしょうか? ハイ。6000行の例はまさに3表を内部結合してその中から where条件に合致するものを抽出するイメージです。

KGM
質問者

補足

親切なコメントありがとうございます。 >各表の行数を10、20、30とすると実際には各>表を横につないだ10×20×30=6000行の>レコードが作られこの中からwhere文に該当する行が>選択されると考えて下さい。 イメージとしてはわかります^^ どうも、自分の中では混乱しています。 WHERE 構成関係表.部品セット番号 = 部品セット関係表.部品セット番号  AND 構成関係表.構成部品番号 = 部品関係表.構成部品番号 上記のSQLは (1)構成関係表の部品セット番号と部品セット関係表.部品セット番号を結合。 かつ(AND) (2)構成関係表の構成部品番号と部品関係表の構成部品番号を結合 という意味になり、構成関係表に紐つけられるという 結果になります。 自分は(1)と(2)でAND(論理積)を取ることになり、 (1),(2)で共通化する箇所しか取れないため、 紐つけができないと思われます。 むしろ、(1)or(2)であれば、共通項目以外の箇所が 取れると思われます。 内容がごちゃごちゃになっていますが、 再度、ご教授の程お願い致します。

  • ymmasayan
  • ベストアンサー率30% (2593/8599)
回答No.2

ANDでいいですよ。 最初の等式で構成関係表と部品セット関係表がくくりつけられ、次の等式で構成関係表と部品関係表がくくり付けられます。 したがって「友達の友達は皆友達」で3表が全て括り付けられます。 各表の行数を10、20、30とすると実際には各表を横につないだ10×20×30=6000行のレコードが作られこの中からwhere文に該当する行が選択されると考えて下さい。

KGM
質問者

補足

ここで使うANDは論理積の意味で使われているものでは ないのでしょうか??それとも、全く異なるものに なるのでしょうか? 自分的には内部結合して、抽出されるイメージが あるのですが、それとは違うのでしょうか?

  • kagep
  • ベストアンサー率23% (171/721)
回答No.1

このWHERE句はANDで合ってます。 図2で抽出したいのは 「伝票番号」「構成部品番号」 を紐つけているデータでしょう。 つまり、伝票が発行されていない構成部品のデータはいらない、ということ。 もしORにすると ・「伝票番号」が空で「構成部品番号」にだけ値がある ・「伝票番号」がにだけ値があり「構成部品番号」が空 というデータが発生する可能性があります。 図2で要求しているデータが、 1.『構成関係表』を基データとし 2.伝票が発行されいている部品の 3.「構成部品番号」「構成部品名」「出荷個数」 を求めている、 ということが理解できれば、ORではダメな事が理解できると思います。

KGM
質問者

補足

WHERE 構成関係表.部品セット番号 = 部品セット関係表.部品セット番号  AND 構成関係表.構成部品番号 = 部品関係表.構成部品番号 上記部分は共通項目を結合して、表を抽出していると 思われますが、ここで使う「AND」は論理積として 使われると思われるので、 一つの表に、「部品セット」と「構成部品番号」の 両方がなければ、紐付けができないと思われます。 以上、宜しくお願い致します。

関連するQ&A