• ベストアンサー

INNER JOINしてGROUP BYしたいんですが

はじめまして。Oracle初心者です。非常にハマって困っています。 テーブルAとBがあります。Aには商品の一覧が、Bには商品の複数の属性が格納されており、AとBをJOINすると、結果に商品が重複して含まれてしまいます。 SELECT A.商品名,B.属性 FROM A INNER JOIN B ON A.商品ID=B.商品ID; 結果 ------- 商品名1,属性あ 商品名1,属性い 商品名1,属性う 商品名2,属性あ .... テーブルBを使って、「属性あ」を持たない重複しない商品名の一覧を取得したいのですが、 SELECT A.商品名,A.商品ID FROM A INNER JOIN B ON A.商品ID=B.商品ID AND B.属性!='属性う' GROUP BY A.商品名,A.商品ID これでできそうな気がするのですが、エラーになってしまいます。 本当はさらにWHEREをつけて SELECT A.商品名,A.商品ID FROM A INNER JOIN B ON A.商品ID=B.商品ID AND B.属性!='属性う' GROUP BY A.商品名,A.商品ID WHERE A.商品名 like 'あ%'; とかもしたいのですが。。 Oracleは10gです。 解決策を教えていただきたく、よろしくお願いします。

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

  • ベストアンサー
  • root139
  • ベストアンサー率60% (488/809)
回答No.1

「属性あ」を持たないという条件はWHERE句に記述し、重複を取り除くにはDISTINCTを使えばよろしいかと。 例) ----------------------------------------------------- SELECT DISTINCT A.商品名, A.商品ID FROM A INNER JOIN B ON A.商品ID = B.商品ID WHERE B.属性 != '属性あ' ---------------------------------------------------------

tomoyu-n
質問者

お礼

さっそく、ご回答ありがとうございます! なるほど、GROUP BYしなくてもDISTINCTは使えるんですね。 明日、さっそく試して見ます。 (質問のSQLが今見直すと「属性あを含まない」と言いながら「B.属性!='属性う'」などと書いていました。まぎわらしくて失礼しました。)

その他の回答 (1)

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.2

DISTINCT ですと、以下のように「全て同じ」でないデータは抽出 されてしまいます。 商品名1,属性い 商品名1,属性う 商品名1だけを抽出したいのであれば GROUP BY を使います。 但し、属性は1個しか取り出せないので、MAX、MINなどで集計する 必要があります。

tomoyu-n
質問者

お礼

今回は、DISTINCTで解決できましたが、大変参考になりました。 ありがとうございました。

関連するQ&A