• ベストアンサー
  • すぐに回答を!

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です。 解決策を教えていただきたく、よろしくお願いします。

共感・応援の気持ちを伝えよう!

  • 回答数2
  • 閲覧数6387
  • ありがとう数3

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

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

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

共感・感謝の気持ちを伝えよう!

質問者からのお礼

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

関連するQ&A

  • group by句

    色々と試行錯誤してやっていますが、なかなか自分の 思うような結果が得られないためご質問させて下さい。 テーブルが全部で3つあります。 テーブルA id name 1 巨人 2   西武 テーブルB id name 1 小笠原 2 ラミレス 3 中島 4  片岡 テーブルC id テーブルAID テーブルBID 背番号 1 1 1 30 2 1 2 10 3 2 3 3 4 2 4 8 テーブルを結合し、テーブルCにある 背番号をテーブルAid,テーブルBidを元に sumしたいのですがうまくいきません。 以下がそのSQLになります。 (1)サブクエリーを使ったSQL この場合値が重複されて表示されてしまいます。 select a.name,b.name,c.name, (select sum(背番号) from tableC c where c.テーブルAId = a.id group by c.テーブルAid ), (select sum(背番号) from tableC c where c.テーブルBid = bid group by c.テーブルBid ) from tableC c inner join tableA a on a.id = c.テーブルAid inner join tableB b on b.id = c.テーブルBid (2) select a.name,b.name,c.name, (select sum(背番号) from tableC c where c.テーブルAId = a.id ), (select sum(背番号) from tableC c where c.テーブルBid = bid ) from tableC c inner join tableA a on a.id = c.テーブルAid inner join tableB b on b.id = c.テーブルBid group by c.テーブルAid 重複はされないのですが、group byが一つのみなので ちゃんとした出力がされません。    他にやり方があるのかもしれませんが、お分かりになる方が    いらっしゃいましたら、ご教授お願い致します。

  • ちょっと見かけないinner joinについて

    どなたか以下の構文について教えて下さい。 どこのDBMSで使用されるものなのでしょう? SELECT B.項目1, B.項目2, A.項目2, A.項目3 FROM ( ( SELECT * FROM Bテーブル WHERE 項目3>"1" ) B INNER JOIN ( SELECT * FROM Aテーブル WHERE 項目2=10 ) A ON B.項目1=A.項目1; 意味はわかるのですが、普通のinner joinとは違うもので。

  • inner joinでサブクエリ

    SQLについてお教え頂けませんでしょうか? 在庫テーブル ・ID ・数量 データ 001,1 001,3 002,3 002,2 002,4 003,2 商品テーブル ・ID データ 001 002 003 004 やりたいこと: 在庫テーブルには重複しているIDがあります。 商品テーブルには重複しているIDはありません。 在庫テーブルの重複を削除したIDと商品テーブルのIDをinner joinで結びたいと思います。 ・select distinct ID FROM 在庫テーブル ・select ID FROM 商品テーブル この2つのjoin方法がわかりません。 結果として、 001 002 003 を取得したいいです。宜しくお願いします。 ちなみに select ID from 商品テーブル inner join 在庫テーブル 商品テーブル.ID = exists(select distinct ID from 在庫テーブル) というコードを書きましたが、動きませんでした・・・抽出データが0件でした・・・

その他の回答 (1)

  • 回答No.2
  • nda23
  • ベストアンサー率55% (773/1384)

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

共感・感謝の気持ちを伝えよう!

質問者からのお礼

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

関連するQ&A

  • サブクエリ内で INNER JOIN は

    グルーピング内で、あるカラムの最大値のレコードで絞り込む方法は、 以下のサイトで知ることができましたが。 http://www.yokablo.com/20120905717.html tb_score +-------+-------+-------+ | c_name | game | c_score | +-------+-------+-------+ | 山田 | 高飛び | 90 | +-------+-------+-------+ | 山田 | 徒競走 | 85 | +-------+-------+-------+ | 山田 | 玉入れ | 90 | +-------+-------+-------+ | 鈴木 | 徒競走 | 85 | +-------+-------+-------+ | 鈴木 | 騎馬戦 | 50 | +-------+-------+-------+ | 室伏 | 綱引き | 100 | +-------+-------+-------+ | 室伏 | 玉入れ | 10 | +-------+-------+-------+ SQL文: SELECT * FROM tb_score INNER JOIN ( SELECT c_name, MAX(c_score) AS MAXSCORE FROM tb_score GROUP BY c_name ) AS TBDUMMY1 USING (c_name) WHERE c_score = MAXSCORE 私の場合、t_score の親テーブル名`t_company`と、 子テーブル`t_items`がありまして、 以下のようなことをやりたかったのですが、エラーとなります。 上記SQL をサブクエリにします。 select * from ( SELECT * FROM tb_score INNER JOIN ( SELECT c_name, MAX( c_score ) AS MAXSCORE FROM tb_score GROUP BY c_name ) AS TBDUMMY1 USING ( c_name ) INNER JOIN t_company ON t_company.c_name = tb_score.c_name WHERE c_score = MAXSCORE ) as T1 , t_items where T1.id_score = t_items.id_score 結果エラーメッセージは、 #1060 - Duplicate column name 'c_name' でした。 エラー箇所が、 GROUP BY c_name か、 USING ( c_name ) か、 INNER JOIN t_company ON t_company.c_name = tb_score.c_name なのか、分かりません。 SQL の規則としてやってはいけないことをやっていると想像してますが、 ご指摘・ご指導いただけると大変に助かります。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • inner joinについて

    SQLのデータ抽出方法についてお教え下さい。 TABLE_2をdistinctで重複を無くして、TABLE_1とinner joinさせたいです。 select distinct TABLE_2.id と select TABLE_1.ID from TABLE_1 inner join distinct TABLE_2.ID といったようなことをやりたいです。 TABLE_1 ID 001 001 002 002 002 TABLE_2 ID 001 001 002 002 002 環境はMYSQL5.5になります。よろしくお願いいたします。

  • SQLPLUSのGROUP BY句について

    Oracle9iのSQLPLUSにて、GROUP BY句で指定した列以外の列をSELECT文の選択結果に表示させたいだけなのですがうまくいきません。 SELECT 列A,列B,列C FROM テーブル1 A INNER JOIN ( SELECT 列A,COUNT(*) FROM テーブル1 GROUP BY 列A HAVING COUNT(*) >= 2 ) B ON A.列A = B.列A 「"B.列A"が無効識別子です」エラーが発生します。 何卒宜しくお願い致します。

  • inner joinをすると数がおかしくなります

    SQLのinner joinについてお教え下さい。環境はWin 7 MYQL5です。 t1テーブルのデータ ID,在庫 001,22 t2テーブルのデータ ID,出庫 001,17 001,3 SELECT Sum(t1.stock) AS `在庫` FROM t1 where id = '001' 上記SQLの結果は22と表示されます。 SELECT Sum(t1.stock) AS `在庫` FROM t1 INNER JOIN t2 on t1.id = t2.id where id = '001' とやると、結果が44になってしまいます。 なぜそんな結果になってしまうのでしょうか? 結果はt1.stockは在庫22なので、22と表示するようにしたいです。 よろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • GROUP BY句について

    SQL_PLUSでの質問です。 以下のSELECT句があります。 GROUP BY句の『'A' AS 区分』は必要なのでしょうか。 ----------------------------- SELECT 商品コード AS 商品コード, 商品名 AS 商品名, 'A' AS 区分, SUM(金額) AS 金額 FROM 売上トラン GROUP BY 商品コード AS 商品コード, 商品名 AS 商品名, 'A' AS 区分; ----------------------------- 何気なくプログラムを見ていたら、目に留まりました。 このままでもコンパイルは通るので問題はないのですが、 決まった値を設定しているのだから、必要ないような気がするのです。 環境はWin2000 Oracle 9i です。 ご存知の方、教えて下さい。

  • INNER JOIN > EXISTS > IN

    SQL Server 2008での話です。 製品テーブルと、その製品の売れ行きのランキングデータを格納するテーブルがあって、 売れ行きの良いものTOP10だけ取り出したいと思っています。 製品IDがキーになっています。 ランクテーブルから10位以内の製品IDをSELECTし、それをIN句に 入れるということをやっていたのですが、遅かったので、EXISTSに 書き変えました。 更に、INNER JOINにしてしまえば、WHERE句より実行されるので、 より速くなると聞き、試しているところです。 実際、速くはなったのですが、以下パターンだとそれほど差が出ません。 (データの件数のせいだとは思いますが…) どちらがベターなのでしょうか。 Bのほうが先に絞り込みをしてから結合されるから、速い…ような気が しているのですが、動き的には一緒だったりしますかね…。 もしより良い書き方がありましたらご教授ください。 ■Aパターン SELECT * FROM 製品テーブル INNER JOIN ランクテーブル ON 製品テーブル.製品ID = ランクテーブル.製品ID AND ランクテーブル.順位 <= 10 ■Bパターン SELECT * FROM 製品テーブル INNER JOIN ( SELECT ランクテーブル.製品ID FROM ランクテーブル WHERE ランクテーブル.順位 <= 10 ) TMP ON TMP.製品ID = 製品テーブル.製品ID

  • OUTER JOIN とgroup by

    こんにちは。 mysqlのselect文なのですが、LEFT OUTER JOIN した右側をgroup byし、そのなかで最大値を持つものを結び付けたいのですが、四苦八苦やってみたところ2日ほど解決できず・・・。 どなたかご教授いただけますと助かります。 テーブルなどは以下の通りです。 ---tableA----(テーブル名) user / supplier(カラム名、以下レコード) 1 / 1 1 / 2 1 / 3 2 / 1 2 / 3 ---tableB--- skuno / supplier / update_at 1 / 1 / 2011-12-12 2 / 1 / 2011-12-13 3 / 1 / 2010-11-10 検索の目的は、特定のカラムuserに対応する(例えばuser = 1)supplierの値(1,2,3)を取り出し、tableBにおいて、それぞれの値に結びつくskunoのうち最新のupdate_atを持つskunoを取り出したいというものです。 上記の例の場合、希望する検索結果は以下のような想定です。 supplier / skuno 1 / 2 2 / null 3 / null 私が検討してみたsql文は以下の通りなのですが、 select supplier,skuno from tableA LEFT JOIN tableB ON tableA.supplier = tableB.supplier where tableA.user = 1 and tableB.update_at IN (select max(update_at) from tableB group by supplier) group by tableA.supplier; この場合だと、右側がnullだとsupplierの値が表示されず、 supplier / skuno 1 / 2 となってしまいます。 select supplier,skuno from tableA LEFT JOIN tableB ON tableA.supplier = tableB.supplier where user = 1 group by supplier; だと右側のテーブルの値が指定できず・・・ ここからどのように条件付けをしたらよいのか、お力添えをいただけますと幸いです。 よろしくお願い申し上げます。

    • ベストアンサー
    • MySQL
  • INNER JOINの有用性

    INNER JOINの有用性 内部結合時に「INNER JOIN」と記述する有用性を教えてください。 内部結合を行なう際は、一般的には FROM句にテーブル名を列挙し WHERE句にテーブル間結合条件を列挙する という形式をとります。少なくとも私は。 これをあえて「INNER JOIN」を使用して記述する有用性が分かりません。 私がぱっと思いつくレベルであれば、 「WHERE句に記述される条件の種類には、抽出条件とテーブル間結合条件の 2種類の条件が混在している。混乱を避ける為これを分離する」 と、屁理屈をこねることも可能ですが、 FROM句にテーブルと「INNER JOIN」記述を混在させるほうが よっぽど分かりにくいように感じます。 あとさらに強いて言えば、「LEFT JOIN」にしたり「INNER JOIN」にしたりを 頻繁に切り替える場合とか。そんなこともまずないと思いますが…。 なので、「INNER JOIN」を使用する有用性をまったく感じません。 あえて使用する意味はあるのでしょうか? 質問は ・内部結合時に「INNER JOIN」を使用する有用性があるのか? ・有用性があるのであればどのような場合か? です。よろしくお願いします。

  • MysqlのONLY_FULL_GROUP_BY

    MySQLの5.7.9でONLY_FULL_GROUP_BYを有効にしています。 3つのテーブル(a, b, m) を結合して以下のようにgroup byした際、with rollupを付けるとエラーになります。rollup なしでは通ります。これは正しい挙動でしょうか。 select a.aid, a.name, b.bid, sum(m.value) from a inner join b on a.aid = b.aid inner join m on m.bid = b.bid group by a.aid, b.bid a.aid, b.bid はいずれもprimary keyです。 with rollup時のエラーは"SELECT list is not in GROUP BY clause and contains nonaggregated column a.name functionally dependent on columns in GROUP BY clause"という内容ですが、a.nameはテーブルの定義上a.idによって一意に決まる値です。

  • SQL文のINNER JOIN内での条件付けについて質問です

    SQLの質問です。 先程も質問させて頂いた件(http://okwave.jp/qa4089307.html)に派生した問題なのですが、 Accessのクエリにて SELECT A.*FROM grade_points AS A INNER JOIN [SELECT MAX(enforcement_date) AS MaxDate,grade_id FROM grade_points WHERE (enforcement_date)<=date() GROUP BY grade_id]. AS B ON (A.grade_id = B.grade_id) AND (A.enforcement_date = B.MaxDate); (前回の件のクエリにWHERE (enforcement_date)<=date() の条件を追加しました) というクエリを作ると、SQLを書いた直後の保存前はちゃんと動くのですが、保存後に閉じてから実行しようとすると「入力テーブルまたはクエリ(上記[]内SQL文)が見つかりません」というエラーになってしまいます。 INNER JOIN内のSQLにWhere条件は使えないのでしょうか??保存前は動くので不思議でなりません… お手数ですがどなたかご意見よろしくお願い致します。