• ベストアンサー

内部結合

テーブルの自己結合について教えてください。 以下のようなテーブル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なのですが、うまく取れません。 なにも取って来なくなります。 何がいけないでしょうか。 アドバイス、よろしくお願いいたします。

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

  • ベストアンサー
  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.1

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

japan_3
質問者

補足

ご回答ありがとうございました。 こんな方法があるのですね・・・。 目から鱗です! ほとんどしたかった事は実現できていると思います。 ただ、フラグは実は0/1ではなくTrue/Falseなのです。 そのため、Maxを使うと出てこなくなりました。 select collumn1 from A group by collumn1 having count(*)>1 なら、B,C,Eが出てきます。 あと一息、Trueのものを含む形にできないでしょうか。 よろしくお願いいたします。

その他の回答 (2)

  • jamshid6
  • ベストアンサー率88% (591/669)
回答No.3

今お使いのDBMSでCASE式が使えるなら、 MAX(CASE WHEN COLLUMN2=1 THEN 1 ELSE 0 END)>0 にすればOKです。 (ACCESSなどであればIIFで)

japan_3
質問者

お礼

アドバイスありがとうございました! accessを使っていましたが、 新しい項目を数値型で作り、 フラグがtrueなら1を、falseなら0を入れることで Maxを使用できるようになりました。 ありがとうございました!!

  • bonaron
  • ベストアンサー率64% (482/745)
回答No.2

ちょっと発想を変えるとできるんですけどね。  企業名でグループ化し、  企業名のカウントが2以上  フラグの最大が1 この条件なら簡単でしょう。 SELECT collumn1 FROM A GROUP BY collumn1 HAVING Count(collumn1)>1 AND Max(collumn2)=1;

japan_3
質問者

お礼

お一人目の方とほぼ同じ時間に、ありがとうございました。 大変参考になりました。

関連するQ&A