アプリ版:「スタンプのみでお礼する」機能のリリースについて

基本的なことなのかもしれませんが・・・

AとBというテーブルがあり、あるタイミングでAを元にBを作成します。つまりBはデータがある場合とない場合があります。また、2つは関連番号で紐づいています。

Aテーブルを抽出したい時に、抽出条件は以下です。
・Bテーブルのステータスが1であれば抽出
・Bテーブルのステータスが0であれば非抽出
・Bテーブルにデータがなければ抽出

INNER JOINだとデータがない時に抽出できないし、
WHERE句にCASE句を入れればいいのかなと思いましたが、テーブルにデータがあればなんて条件書けないしで詰まりました。
SELECTした結果に対して条件つけて抽出する手も思いつきましたが
もっと美しいSQLがあれば教えてもらえないでしょうか。

環境はSQLServerです。よろしくお願いします。

A 回答 (4件)

外部結合してステータスが1 or nullのものでは出ませんか?

    • good
    • 0

片方のテーブルにデータがなくても抽出したい場合は


LEFT JOINなどの外部結合を使います。
するとBテーブルにデータがないと、Bテーブルを参照する値がNULLで帰ってきます。
その上で、WHERE STAT=1 OR STAT=NULL
で抽出できます。
AにDATAとID、BにIDとSTATとして、Bでつながってると
以下で検索できます。

SELECT A.DATA, A.ID, B.STAT
FROM A LEFT JOIN B ON A.ID=B.ID
WHERE B.STAT=1 OR B.STAT IS NULL
    • good
    • 0
この回答へのお礼

ありがとうございます。

ただ、LEFT JOINすると、BのデータはNULLで返ってきますが、Aのデータは抽出できてしまいました。

Bのステータスを条件として、否であればAのデータもろとも抽出しないという風にしたいのです。

お礼日時:2005/03/23 17:30

Aが Bが


ID NAME ID STAT
1 ABC 1 0
2 DEF 3 1
3 XYZ
のときに
ID NAME STAT
2 NULL NULL
3 XYZ 1
とするのでしょうか?

そうするなら、INNER JOINでAとBを結合して、
それをLEFT JOINすればいけそうです。

SELECT A.ID, C.DATA, C.STAT FROM A
LEFT JOIN (
SELECT DATA, A.ID ID, STAT FROM A
INNER JOIN B ON A.ID=B.ID
) C
ON A.ID=C.ID
WHERE C.STAT=1 OR C.STAT IS NULL
    • good
    • 0
この回答へのお礼

ありがとうございます!

INNER JOINしたものをLEFT JOIN。。。
僕の概念には全くなかった方法です。勉強になります。

お礼日時:2005/03/24 11:44

一般的手法である外部結合(LEFT-JOIN)での場合



select A.*
from A left join B on (A.関連番号=B.関連番号)
where B.関連番号 is NULL or B.ステータス=1


オマケですが..

外部結合なんかなくたって..その1

select A.* from A,B where B.関連番号=A.関連番号 and B.ステータス=1
union all
select A.* from A where not exists(select 1 from B where B.関連番号=A.関連番号)

外部結合なんかなくたって..その2

select A.* from A
where not exists(select 1 from B where B.関連番号=A.関連番号 and B.ステータス=0)
    • good
    • 0
この回答へのお礼

ありがとうございます!

そうか、LEFT JOINしてそれに対してWHERE句で条件加えれば。

UNIONに関してはすっぽり抜け落ちてました。。。
NOT EXISTSなんてのがあるんですね。
勉強になりました。

お礼日時:2005/03/24 11:47

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

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A