- ベストアンサー
フラグがたっているデータがあったら検索かけたい・・。
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年目の新人なので、どなたかご教授お願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
コピペするのに、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)
索引の有無やデータ量等によっては、優劣が出てくるかと思いますが.. 相関サブクエリ(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)
どうしても 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番号 こんな感じでもできますよ
- k_o_r_o_c_h_a_n
- ベストアンサー率55% (526/942)
次のようなSQLで良いかと思います。 select * where A.グループ番号 in (select distinct グループ番号 from A where ステータスフラグ=1) and A.ID番号=B.ID番号