- ベストアンサー
内部結合
テーブルの自己結合について教えてください。 以下のようなテーブルAがあります。 Table A collumn1(企業名) collumn2(フラグ) B 0 C 0 D 1 B 1 C 0 E 0 E 1 E 1 これにおいて、フラグが1の企業でかつ フラグの如何に関わらず同じ企業名があればその企業名を とってきたいです。 上の例では企業BとEとなります。 企業名が同じでもフラグが0のものばかりであればとってきません。 この条件を私が考えたのは select collumn1 from A where collumn2 = 0 and collumn1 = (select collumn1 from A where collumn2 = 1) というSQLなのですが、うまく取れません。 なにも取って来なくなります。 何がいけないでしょうか。 アドバイス、よろしくお願いいたします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
DBMSが何で、どうやって呼んでいるかはわかりませんが、 そのアプローチでは、対象件数がゼロなのではなく、エラーになっていると考えるべきかと。 collumn1 = (select collumn1 from A where collumn2 = 1) は collumn1 IN (select collumn1 from A where collumn2 = 1) でないと普通はエラーになるからです(戻り値が複数ある場合イコールは使えない) 上記の通り書き換えれば、BとEは返ってきます。 しかし、それでも、[E,0]のレコードがなかった場合はEは抽出されなくなります。 こういうやり方はどうでしょう? select collumn1 from A group by collumn1 having count(*)>1 AND max(collumn2)>0
その他の回答 (2)
- jamshid6
- ベストアンサー率88% (591/669)
今お使いのDBMSでCASE式が使えるなら、 MAX(CASE WHEN COLLUMN2=1 THEN 1 ELSE 0 END)>0 にすればOKです。 (ACCESSなどであればIIFで)
お礼
アドバイスありがとうございました! accessを使っていましたが、 新しい項目を数値型で作り、 フラグがtrueなら1を、falseなら0を入れることで Maxを使用できるようになりました。 ありがとうございました!!
- bonaron
- ベストアンサー率64% (482/745)
ちょっと発想を変えるとできるんですけどね。 企業名でグループ化し、 企業名のカウントが2以上 フラグの最大が1 この条件なら簡単でしょう。 SELECT collumn1 FROM A GROUP BY collumn1 HAVING Count(collumn1)>1 AND Max(collumn2)=1;
お礼
お一人目の方とほぼ同じ時間に、ありがとうございました。 大変参考になりました。
補足
ご回答ありがとうございました。 こんな方法があるのですね・・・。 目から鱗です! ほとんどしたかった事は実現できていると思います。 ただ、フラグは実は0/1ではなくTrue/Falseなのです。 そのため、Maxを使うと出てこなくなりました。 select collumn1 from A group by collumn1 having count(*)>1 なら、B,C,Eが出てきます。 あと一息、Trueのものを含む形にできないでしょうか。 よろしくお願いいたします。