• ベストアンサー

フラグがたっているデータがあったら検索かけたい・・。

Aテーブルにグループ番号、ID番号、氏名、ステータスフラグが格納されており、BテーブルにID番号、氏名、電話番号、住所が格納されているとします。検索したい条件は、同じグループの中で、ステータスフラグがたっているレコードが1件でもあれば、ID番号を使って、Bテーブルと結合してグループ番号でGROUP BYしてデータがとりたいのです。例えば、Aテーブルにグループ番号001のグループ番号を持つレコードが5レコードあり、そのうちステータスフラグがたっているレコードが1レコード。002のグループ番号を持つレコードが3レコードあり。ステータスフラグがたってるのが0レコードだとします。結果として、001のグループはステータスフラグがたっているレコードがあるから、検索対象になるが、002はステータスフラグがたっているレコードがないので、検索対象にならないといった具合なんですが・・・。よろしくお願いします。自分で考えたSQLは次のものです。SELECT * FROM A, B WHERE A.ID_NUMBER=B.ID_NUMBER GROUP BY A.GROUP_NUMBER HAVING COUNT(A.STATUS=1)>0 こんな感じです。ただCOUNT関数ではこれではダメみたいで・・・。まだ、1年目の新人なので、どなたかご教授お願いします。

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

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

コピペするのに、1行とんだ.. こちらが正しいSQL。 select * from A,B where A.グループ番号 in (select distinct グループ番号 from A where ステータスフラグ=1) and A.ID番号=B.ID番号

その他の回答 (3)

  • fu_u_ka_i
  • ベストアンサー率51% (15/29)
回答No.4

索引の有無やデータ量等によっては、優劣が出てくるかと思いますが.. 相関サブクエリ(EXISTS条件)やメンバーシップ検査(IN条件)、 インラインサブクエリとの結合など、複数の解決方法があり、 何の前提もおかず考えると、好き嫌い程度の違いでしかないと 思います。 とはいうものの... #3 HAVINGを使うのであれば、 SELECT A.*,B.* FROM A, B, ( select グループ番号 from A where ステータス=1 /* ここ */ group by グループ番号 having count(*) > 0 /* ここ */ ) C WHERE C.グループ番号=A.グループ番号 AND A.ID番号=B.ID番号 ; のように、where句を省略しては、いけません。 where句で対象を絞れるにもかかわらず、そうしないのは 実行効率の観点で×です。

  • raphel_7
  • ベストアンサー率34% (86/252)
回答No.3

どうしても GROUP BY が使いたいのであれば・・・。 SELECT *  FROM A A,     B B,     (SELECT グループ番号       FROM  A      GROUP BY グループ番号      HAVING COUNT(ステータス) > 0 ) C  WHERE C.グループ番号 = A.グループ番号   AND A.ID番号 = B.ID番号 こんな感じでもできますよ

回答No.1

次のようなSQLで良いかと思います。 select * where A.グループ番号 in (select distinct グループ番号 from A where ステータスフラグ=1) and A.ID番号=B.ID番号

関連するQ&A