dポイントプレゼントキャンペーン実施中!

テーブルの自己結合について教えてください。
以下のようなテーブル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なのですが、うまく取れません。
なにも取って来なくなります。

何がいけないでしょうか。
アドバイス、よろしくお願いいたします。

A 回答 (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

この回答への補足

ご回答ありがとうございました。
こんな方法があるのですね・・・。
目から鱗です!

ほとんどしたかった事は実現できていると思います。
ただ、フラグは実は0/1ではなくTrue/Falseなのです。

そのため、Maxを使うと出てこなくなりました。
select collumn1 from A
group by collumn1
having count(*)>1
なら、B,C,Eが出てきます。

あと一息、Trueのものを含む形にできないでしょうか。
よろしくお願いいたします。

補足日時:2008/12/08 13:59
    • good
    • 0

今お使いのDBMSでCASE式が使えるなら、


MAX(CASE WHEN COLLUMN2=1 THEN 1 ELSE 0 END)>0
にすればOKです。
(ACCESSなどであればIIFで)
    • good
    • 0
この回答へのお礼

アドバイスありがとうございました!

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

ありがとうございました!!

お礼日時:2008/12/08 14:33

ちょっと発想を変えるとできるんですけどね。


 企業名でグループ化し、
 企業名のカウントが2以上
 フラグの最大が1
この条件なら簡単でしょう。

SELECT collumn1
FROM A
GROUP BY collumn1
HAVING Count(collumn1)>1 AND Max(collumn2)=1;
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/12/08 14:35

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