• ベストアンサー

SELECTで商品AとBを購入した得意先の抽出方法

以下のようなテーブルがある場合に、SELECT文で商品Aと商品Bを両方購入している得意先のレコードを抽出することは可能でしょうか?得意先や商品は以下に限らず複数登録されています。 いい方法がありましたら教えてください。よろしくお願いします。 URIAGE_TBL 得意先  商品 数量 --------------------- 会社1   A   1   <- 抽出 会社1   B   2   <- 抽出 会社1   C   1   <- 抽出 会社2   D   1 会社3   A   2   <- 抽出 会社3   B   1   <- 抽出 会社4   A   2 会社4   C   2

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

  • ベストアンサー
  • xcrOSgS2wY
  • ベストアンサー率50% (1006/1985)
回答No.5

create table test ( x varchar(10), y varchar(10), z int ) で insert test values('会社1','A',1) insert test values('会社1','B',2) insert test values('会社1','C',1) insert test values('会社2','D',1) insert test values('会社3','A',2) insert test values('会社3','B',1) insert test values('会社4','A',2) insert test values('会社4','C',2) しておいて SELECT a.x   FROM test a, test b   WHERE     a.x = b.x AND     a.y = 'A' AND     b.y = 'B' すると x ---------- 会社1 会社3 となります。 これをサブクエリに入れれば SELECT *   FROM test   WHERE x IN (     SELECT a.x       FROM test a, test b       WHERE         a.x = b.x AND         a.y = 'A' AND         b.y = 'B'     ) で x y z ---------- ---------- ----------- 会社1 A 1 会社1 B 2 会社1 C 1 会社3 A 2 会社3 B 1 となります。 ちなみに、既回答の中では回答No.2のSQLが同じ結果になります。

sakurauo
質問者

お礼

できました! なるほどですね。回答ありがとうございました!!

すると、全ての回答が全文表示されます。

その他の回答 (5)

  • asahina02
  • ベストアンサー率47% (95/202)
回答No.6

#2です。 >残念ながら同じ会社で同じ商品のレコードが複数存在していました。 ということなのでちょっと修正してみました。 select * from URIAGE_TBL where 得意先 in (  select 得意先 from (   select distinct 得意先,商品   from URIAGE_TBL  ) tmp  where 商品 in ( 'A', 'B' )  group by 得意先  having count(*) >= 2 ) ちょっと長くなってしまってSQL的にどうかなとは思いますが、 これでお望みの結果は抽出できるかと

sakurauo
質問者

お礼

おお。distinct で重複分を除いてから抽出するんですね。 うまくいきました!ありがとうございました~!!

すると、全ての回答が全文表示されます。
  • bdr
  • ベストアンサー率43% (35/80)
回答No.4

No.3です サブクエリに「DISTINCT」が必要でした SELECT 得意先,商品,数量 FROM URIAGE_TBL WHERE 得意先 IN (SELECT DISTINCT 得意先 FROM URIAGE_TBL WHERE 商品 IN ('A','B')) または SELECT 得意先,商品,数量 FROM URIAGE_TBL WHERE 得意先 IN (SELECT DISTINCT 得意先 FROM URIAGE_TBL WHERE 商品 = 'A' OR 商品 = 'B'))

sakurauo
質問者

お礼

こちらも会社4まで出力されちゃいました。 でも回答ありがとうございました~。

すると、全ての回答が全文表示されます。
  • bdr
  • ベストアンサー率43% (35/80)
回答No.3

恐らく以下のSQLで大丈夫だと思います SELECT 得意先,商品,数量 FROM URIAGE_TBL WHERE 得意先 IN (SELECT 得意先 FROM URIAGE_TBL WHERE 商品 IN ('A','B')) または SELECT 得意先,商品,数量 FROM URIAGE_TBL WHERE 得意先 IN (SELECT 得意先 FROM URIAGE_TBL WHERE 商品 = 'A' OR 商品 = 'B'))

sakurauo
質問者

お礼

ありがとうございます。 でも頂いた回答だと会社4まで出力されちゃいますね。。

すると、全ての回答が全文表示されます。
  • asahina02
  • ベストアンサー率47% (95/202)
回答No.2

ある会社についてある商品のレコードが複数存在しない という条件であれば以下のSQLで抽出できるかな? select * from URIAGE_TBL where name in ( select name from URIAGE_TBL where data in ( 'A', 'B' ) group by name having count(*) >= 2 ) SQLの意味ですが、まず会社毎に商品がAまたはBのレコードを抽出して、 2件以上(AもBもある)会社を抽出します。 その会社名と一致するデータを元のテーブルから抽出します。 でも・・件数が多くなると遅くなるかなぁ・・・

sakurauo
質問者

お礼

残念ながら同じ会社で同じ商品のレコードが複数存在していました。 情報不足ですみません。。。回答ありがとうございました!

すると、全ての回答が全文表示されます。
  • O_cyan
  • ベストアンサー率59% (745/1260)
回答No.1

select * from (select * from URIAGE_TBL where 商品 = 'A') where 商品 = "B"; ; これで行けないでしょうか。

sakurauo
質問者

お礼

ありがとうございます。 でもこれだとレコードが1件も抽出されません。。。

すると、全ての回答が全文表示されます。

関連するQ&A