• ベストアンサー

サブクエリとDISTINCTGROUPBYの併用は不可??

SQLで副で問い合わせたときグループバイやDISTINCTがエラーになってしまいます。 何故なのか検討がつきません。 同じデータを持つ様々なデータベースでやってますがどれもエラーになります。 オラクルやMYSQLやpostgreSQLです。 SELECT * FROM TableName WHERE 担当 IN (SELECT 担当 FROM TableName WHERE 売上品 = '竹輪') AND 担当 IN (SELECT 担当 FROM TableName WHERE 売上品 = '胡瓜') AND 売上品 IN ('竹輪','胡瓜') ; これは普通に出来ます。 これに対して… SELECT distinct 担当, 商品, 売上品 from…かGroup By 担当, 商品とやっても何故かエラーが出ます… 何か間違ってますでしょうか?

  • Oracle
  • 回答数2
  • ありがとう数13

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

  • ベストアンサー
回答No.1

SELECT 担当, 商品, count(*) FROM TableName WHERE 担当 IN (SELECT 担当 FROM TableName WHERE 売上品 = '竹輪') AND 担当 IN (SELECT 担当 FROM TableName WHERE 売上品 = '胡瓜') AND 売上品 IN ('竹輪','胡瓜') GROUP BY 担当, 商品 ; とか普通に通ると思いますけど? ・DISTINCTが、他の何かと矛盾する。 ・GROUP BYが、他の何かと矛盾する。 のだと思いますよ。 ちなみに、担当 IN (SELECT 担当 FROM TableName WHERE 売上品 = '竹輪') のような WHEREに指定するメンバーシップ検査が、GROUP BYやDISTINCTの邪魔はしません。

その他の回答 (1)

  • 3rd_001
  • ベストアンサー率66% (115/174)
回答No.2

とりあえず、エラーコードを載せましょう。 また、再現するコードを載せましょう。 > SELECT distinct 担当, 商品, 売上品 > from…か > Group By 担当, 商品 > とやっても何故かエラーが出ます これをみるかぎりだと、select とgroup byの項目が あっていないだけに見えますが? こんな感じ? >select distinct empno,ename ,count(*) from emp group by empno > * >行1でエラーが発生しました。: >ORA-00979: GROUP BYの式ではありません。 このORA-xxxxが重要です。このエラーコードがわからない限り、何のエラーだか第三者にはわかりません。 根本の問題として、distinctとgroup byの使用目的は異なります。 ・distinctは重複を省く。 ・group byは集計を行う。 目的(仕様)をはっきりさせれば、おのずと使用するsqlは決まります。

関連するQ&A

  • あいまい検索の仕方で・・・

    SELECT 担当, 商品, 売上品 FROM TableName WHERE 担当 IN (SELECT 担当 FROM TableName WHERE 売上品 = '竹輪') AND 担当 IN (SELECT 担当 FROM TableName WHERE 売上品 = '胡瓜') AND 売上品 IN ('竹輪','胡瓜') とサブクエリで出したいものが出ますが・・・あいまい検索にしたいと思っています。 SELECT 担当, 商品, 売上品 FROM TableName WHERE 担当 IN (SELECT 担当 FROM TableName WHERE 売上品 like '%竹輪%') AND 担当 IN (SELECT 担当 FROM TableName WHERE 売上品 like '%胡瓜%') AND 売上品 IN ('竹輪','胡瓜') まではわかるのですが売上品 IN ('竹輪','胡瓜')はどうすればよいのでしょうか?

  • サブクエリで別の列から組み合わせたいのですが

    以前「売上品で”竹輪”と”胡瓜”を含んだ担当コード」の出し方で教わり出来ました。その節は有難うございました。 今度また困ってしまったのですが同じようにサブクエリを用いて検索しようと思うのですがうまく出来ません。 売上品の竹輪か品コードのどちらかを含むものを検索したいのですがレコードが全く出てきません(エラーにもなりません・・・) 何がいけないのか見当がつきません・・・ 品コードは売上品に紐付けされているコードです。 _____担当_____商品_____売上品_____品コード _____XXXX_____1111______竹輪______T000001 _____XXXX_____1111______胡瓜______K000005 _____XXXX_____1111______西瓜______S000010 _____XXXX_____1111______パン______P000023 _____YYYY_____2222______竹輪______T000001 _____YYYY_____2222______茄子______N456789 _____YYYY_____2222______西瓜______S000010 _____YYYY_____2222______生姜______SH01234 _____YYYY_____2222______柚子______Y100000 _____ZZZZ_____3333______竹輪______T000001 _____ZZZZ_____3333______パン______P000023 _____ZZZZ_____3333______胡瓜______K000005 _____ZZZZ_____3333______冬瓜______T111111 「売上品で”竹輪”と品コードで”K000005”を含んだ担当コード」を抽出したいのですが・・・ SELECT 担当, 商品, 売上品 FROM TableName WHERE 担当 IN (SELECT 担当 FROM TableName WHERE 売上品 = '竹輪') AND 担当 IN (SELECT 担当 FROM TableName WHERE 品コード = 'K000005) AND 売上品 IN ('竹輪','K000005’) 違いますでしょうか・・・・

  • データが重複するのを回避するには・・・(泣)

    SQLでサブクエリを作りましたが結果が複数同じものが出てしまいます。 DISTINCTだと一つの行しか見えなくなってしまいます。 レコードの構成自体がそうなっているからなんですが・・・ SELECT 担当, 商品, 売上品 FROM TableName WHERE 担当 IN (SELECT 担当 FROM TableName WHERE 売上品 = '竹輪') AND 担当 IN (SELECT 担当 FROM TableName WHERE 売上品 = '胡瓜') AND 売上品 IN ('竹輪','胡瓜') ; 竹輪と胡瓜の要素を含んでいる担当を出したいのですが”担当”が重複してしまうのを解消したいです。 あとOrder By とGroup Byは併用不可ですか? _____担当_____商品_____売上品 _____XXXX_____1111______竹輪 _____XXXX_____1111______胡瓜 _____XXXX_____1111______西瓜 _____XXXX_____1111______ハンバーグ _____XXXX_____2222______竹輪 _____XXXX_____2222______茄子 _____XXXX_____2222______西瓜 _____XXXX_____2222______生姜焼き _____XXXX_____2222______柚子 _____XXXX_____3333______竹輪 _____XXXX_____3333______キャベツ _____XXXX_____3333______胡瓜 _____XXXX_____3333______冬瓜

  • 同一列からandでSELECTしたいのですが・・・

    Oracle10gかMySQLでやることになるとおもいます。ひょっとしたらPostgeSQLかも??? _____担当_____商品_____売上品 _____XXXX_____1111______竹輪 _____XXXX_____1111______胡瓜 _____XXXX_____1111______西瓜 _____XXXX_____1111______ハンバーグ _____YYYY_____2222______竹輪 _____YYYY_____2222______茄子 _____YYYY_____2222______西瓜 _____YYYY_____2222______生姜焼き _____YYYY_____2222______柚子 _____ZZZZ_____3333______竹輪 _____ZZZZ_____3333______キャベツ _____ZZZZ_____3333______胡瓜 _____ZZZZ_____3333______冬瓜 上記のようなテーブルがあるとします。 その中から売上品の項目しか分からないとします。売上品で”竹輪”と”胡瓜”を含んだ担当コードを出したいのですが・・・ 例えば一つずつなら select 担当, 商品, 売上品 from TableName where 売上品 = ”竹輪”; _____XXXX_____1111______竹輪 _____YYYY_____2222______竹輪 _____ZZZZ_____3333______竹輪 select 担当, 商品, 売上品 from TableName where 売上品 = ”胡瓜”; _____XXXX_____1111______胡瓜 _____ZZZZ_____3333______胡瓜 ですが売上品で”竹輪”と”胡瓜”を含んだものがほしいので結果としては _____XXXX_____1111______竹輪 _____ZZZZ_____3333______竹輪 _____XXXX_____1111______胡瓜 _____ZZZZ_____3333______胡瓜 となります。和の集合のような感じでしょうか?ANY ALLでしょうか? 売上品の中で竹輪と胡瓜二つの要素を持った結果だけ欲しいのです。よくわからないので教えて下さい。

  • Delphiでサブクエリは可能か

    Delphiいやプログラム初心者のものなのですが 困っていますのでどなたか回答願えればと思っております。 Delphiではサブクエリを発行することはできないのでしょうか? 色々試してみてるのですが、「キーワードが無効です'('」のような エラーが出てしまいます。 例えば以下のような場合 SELECT 日付,商品No,商品名,SUM(仕入数) AS 仕入数,SUM(売上数) AS 売上数 FROM ( SELECT siire_date AS 日付,goods_code AS 商品コード,goods_name AS 商品名,SUM(vol) AS 仕入数,0 AS 売上数 FROM SiireData WHERE siire_date >= '2006/05/01' AND siire_date < '2006/06/01' GROUP BY siire_date ,goods_code ,goods_name UNION ALL SELECT delivery_date AS 日付,goods_code AS 商品コード,goods_name AS 商品名,0 AS 仕入数,SUM(vol) AS 売上数 FROM URIAGEDATA WHERE delivery_date >= '2006/05/01' AND delivery_date < '2006/06/01' GROUP BY delivery_date ,goods_code ,goods_name ) サブクエリが無理であれば、一時テーブルを利用しようと考えているのですが・・・わかりません。 Delphi Ver5.0を使って開発しています。 DBはDatabaseDesktop?を利用 どちらの回答でも結構ですのでご教授よろしくお願いします。

  • サブクエリ

    サブクエリで、t2テーブルに列が無いか、t2テーブルの中でuflgの値が1である列がヒットする場合に真を返すなら、 where ... and 0=(select count(*) from t2) or 0<(select count(*) from t2 where uflg=1) のようにサブクエリに2つのselectを書かないと無理ですか?

  • MySQLのサブクエリ

    おせわになっております。 MySQLを愛用していますが、気になる疑問にぶつかりましたので、質問させてください。 ★MySQLの4.1系のサブクエリは、性能が悪いのですか? たとえば select * from t1 where key in ( select key from t2 where key2 in ( select key2 from t3 where col = 1)) のようなことをしようとしたとき、ものすごく遅いことがあります。 あきらめて、クエリを分けて、小分けに実行すれば、速いです。 サブクエリなどを高速に実行させる方法などありますでしょうか?MySQL5では違うものなのでしょうか? よろしくお願いします

  • サブクエリに関して()

    $sql2 = 'SELECT ki,id,name,day,tday,st FROM tim WHERE (ki,name,day,st) IN (SELECT ki,name,day,max(st) FROM tim WHERE (ki,name,day) IN (SELECT ki,name,MAX(day) FROM tim where ki='.$_SESSION['ki'].' GROUP BY id) group by id)' ; IDごとにカラムday,stの最大値を出力するもです。(以前おしえていただきました) これに更にsvの最大値も条件にいれたい場合どうしたらいいでしょうか?;

    • 締切済み
    • PHP
  • サブクエリの複数項目

    いつもお世話になっております。 サブクエリで複数項目を取得する方法をご教授下さい。 [既存] select 商品, 価格, (select user_id from user_master where user_id = 1 ) from products where 商品ID = 1 上記のようなSQLがあり、 user_masterから取得する項目をもうひとつ追加したいと思っています。(user_name) select 商品, 価格, (select user_id, user_name from user_master where user_id = 1 ) as user from products where 商品ID = 1 と修正したいのですが、当然エラーになってしまいます。 この場合は別にサブクエリを指定して取得した方がいいのでしょうか。 宜しくお願い致します。

  • 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件でした・・・