電子書籍の厳選無料作品が豊富!

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年目の新人なので、どなたかご教授お願いします。

A 回答 (4件)

コピペするのに、1行とんだ..


こちらが正しいSQL。

select *
from A,B
where
A.グループ番号 in
(select distinct グループ番号 from A where ステータスフラグ=1) and
A.ID番号=B.ID番号
    • good
    • 0

索引の有無やデータ量等によっては、優劣が出てくるかと思いますが..



相関サブクエリ(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句で対象を絞れるにもかかわらず、そうしないのは
実行効率の観点で×です。
    • good
    • 0

どうしても 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番号

こんな感じでもできますよ
    • good
    • 0

次のようなSQLで良いかと思います。



select *
where
A.グループ番号 in
(select distinct グループ番号 from A where ステータスフラグ=1) and
A.ID番号=B.ID番号
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す