質問: ### GROUP BYと副照会の共存について 学校の課題でわからないところがあり、投稿させていただきました。 特に副照会とGROUP BYの共存の仕方についてです。 まず、課題というのは「大阪商会が発注した商品と同じ商品を発注したことのある顧客の顧客名とその住所のリストを返すSQLコマンドを作成せよ。ただし、同じ企業名が重複して表示されないようにすること」というものです。(課題で使う、データベースについては下に画像として張っておきます。少し見にくいかもしれませんが、) 僕はこの課題を攻略するため、 1 顧客表と受注明細表を結合 ↓ 2顧客表の大阪商会という行を選ぶ。 ↓ 3そこから受注明細表の商品番号(つまり、大阪商会が買った商品番号)を取得 ↓ 4副照会を使い、3の商品番号と、受注明細表の商品番号をつきあわせる(大阪商会の買った商品を買った顧客番号を得るため) ↓ 5かぶっている顧客名をGROUP BYでまとめる ↓ 6顧客表と受注明細表を結合 ↓ 74の顧客番号を見て、顧客表から顧客名を割り出す。 という道筋を立てました。 しかし、題目にも書いた通り5の部分、「かぶっている顧客名をGROUP BYでまとめる」ことができませんでした。 というのも、GROUP BYをどこに書いたとしてもエラーとなってしまうからです。 以下は5を抜いたコードです。 ``` SELECT KOKYAKUMEI 7 FROM KOKYAKU X ,JMEISAI Y WHERE X.KOKYAKUNO=Y.KOKYAKUNO 6 AND Y.SHOHINNO IN( 4 SELECT SHOHINNO 3 FROM KOKYAKU X,JMEISAI Y WHERE X.KOKYAKUNO=Y.KOKYAKUNO 1 AND X.KOKYAKUMEI='大阪商会' 2 ) ・・・ GROUP BY KOKYAKUMEI 5 ・・・どこに書いてもエラー ``` このコードの結果は狙い通り、上手くでました。 ``` 東京商事 東京商事 大阪商会 大阪商会 西中国商店 ``` あとはこれをまとめればいいだけなのですが、その一線がどうしても超えられません。 つまり、GROUP BYと副照会の共存についてできません。 私の考えた方のどこが間違っているのか・・・? どうかご教授おねがします!!! ![](https://teratail.storage.googleapis.com/uploads/contributed_images/b649986fae0e344838bfe718f669a98e.jpeg)
回答: > > 「大阪商会が発注した商品と同じ商品を発注したことのある顧客の顧客名とその住所のリストを返すSQLコマンドを作成せよ。ただし、同じ企業名が重複して表示されないようにすること」 > > > 求めたい結果は、「**顧客名とその住所のリスト**」 その結果に対する条件は、「**大阪商会が発注した商品と同じ商品を発注したことのある顧客**」 「ただし、同じ企業名が重複して表示されないようにすること」については、「顧客名とその住所のリスト」という性質上あり得ないことなので、課題としての**注釈**ですね。 テーブルの構成を見ると、顧客表に対して「顧客番号」条件にする必要があることは分かる。 じゃあ、条件として「大阪商会が発注した商品と同じ商品を発注したことのある顧客」の問い合わせ結果を条件にすればいい事に。 大阪照会が注文した商品を求めるには顧客番号と商品番号が分かればいいので、受注明細表で事足りる。 その商品を注文している顧客は逆のパターンで受注明細表で求められる。 ``` SELECT * FROM KOKYAKU WHERE KOKYAKUNO in ( select KOKYAKUNO from JMEISAI where SHOHINNO in (select SHOHINNO from JMEISAI where KOKYAKUNO='D010') ) ``` 結合すると件数が増えるけど、結合して取得する項目ではないので、単に条件としてin を使用すれば、group by は不要ですね。 リストには大阪商会も含まれるので、大阪商会以外のリストなら条件を追加。