みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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です。

解決策を教えていただきたく、よろしくお願いします。

投稿日時 - 2009-07-20 19:26:47

QNo.5141290

すぐに回答ほしいです

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

「属性あ」を持たないという条件はWHERE句に記述し、重複を取り除くにはDISTINCTを使えばよろしいかと。

例) -----------------------------------------------------
SELECT
DISTINCT A.商品名, A.商品ID
FROM
A INNER JOIN B ON A.商品ID = B.商品ID
WHERE
B.属性 != '属性あ'
---------------------------------------------------------

投稿日時 - 2009-07-20 22:31:46

お礼

さっそく、ご回答ありがとうございます!
なるほど、GROUP BYしなくてもDISTINCTは使えるんですね。
明日、さっそく試して見ます。

(質問のSQLが今見直すと「属性あを含まない」と言いながら「B.属性!='属性う'」などと書いていました。まぎわらしくて失礼しました。)

投稿日時 - 2009-07-20 23:21:16

ANo.1

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

DISTINCT ですと、以下のように「全て同じ」でないデータは抽出
されてしまいます。

商品名1,属性い
商品名1,属性う

商品名1だけを抽出したいのであれば GROUP BY を使います。
但し、属性は1個しか取り出せないので、MAX、MINなどで集計する
必要があります。

投稿日時 - 2009-07-21 09:43:16

お礼

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

投稿日時 - 2009-07-22 17:28:56

あなたにオススメの質問