プロが教えるわが家の防犯対策術!

お世話になります。

AccessのSQLで教えてください。

現在、
select *
from テーブルA
where CD="111"
で、CD=111のデータを抽出しているのですが、これを
CD=111があれば、CD=111を、CD=111がなければ、C=222を
抽出するようにしたいのですが、
どのようなSQL分を書けばよいでしょうか?

素人で申し訳ございませんが、具体的なSQLがわかる方
よろしくお願いいたします。

A 回答 (6件)

ゲンタ君です。

勝手ながら書き込みます。
採用するもしないもあなたの勝手です。

SELECT * FROM テーブルA A WHERE A.CD = "111" OR A.CD = "222"
AND NOT EXISTS(SELECT * FROM テーブルA B WHERE A.ID = B.ID AND B.CD = "111")
    • good
    • 0
この回答へのお礼

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

数々のご無礼お詫び申し上げます!!
申し訳ございませんでした!!

お礼日時:2018/05/15 17:38

>if分で、CD=111 がなかったら、CS=222を探す!!ってできないのでしょうか。

。。

やりたい事の意味が良くわからないのですが、select句を使っているからには該当する(条件を満たす)レコードの抽出ですよね。

CDというフィールド(列)に任意の数字が入っているレコードがたくさん、、、とりあえず1000あったとします。
わかりやすいようにレコードには1から順番にIDを付けるとしますね。

ID1のCDには「111(データ型は??)」が入っていたとする場合、それ以外の値は存在できません。
ただ、IDが2のCDには「115」や「222」だったりが入っている可能性はあります。

この場合はNo.1に書いた通り、「CDが111か222」のレコードを抽出でよいはずです。
わざわざ「なかったら探して、、」というようなことを言う必要もありません。

次がNo.2で CDと別のもう一つフィールドがあるケース、、、仮にCSとします。

ID CD  CS  という構造で、下記の四つのレコードがあった場合、あなたが抽出したいのはどれでしょうか?
1 110 235
2 111 222
3 110 222
4 111 220

CDをみて111なら該当すればそれを、無ければCSが222のレコードを抽出となら、2 3 4 が該当します。

つまりは CD=111 または CS=222 (両方満たしてもOK)です。No.1のままです。

2のパターンはNG(除外する)としたい場合がNo.2のような排他論理和です。
あなたの言うパターンをそのまま当てはめると2がNGという場合、除外されません。

また、if文(SQL内では使えませんが)やCase句は条件によって処理が分岐されるものであり、もともとが抽出するという処理をするSelect句とは意味合いが違います。Where句はいわばフィルター、ふるいのようなものなので、「条件に合うものを探して」という感じです。ここでは「CD=111でなかったら」という表現をする意味も理由もないのです。

AccessVBA内でレコードセットを作ってif文で同じ処理をする事も出来ますが、結果は同じなのに圧倒的に遅いです。
    • good
    • 0
この回答へのお礼

お手数をお掛けして申し訳ございません。
以下のテーブルを
---------------------
ID CD atai
A 111 1
A 222 2
B 222 3
C 333 4
--------------------
この形にしたいのです。
---------------------
ID CD atai
A 111 1
B 222 3
--------------------


ID=Aは、atai=1※CDに111があるので。CD=222は,111があるので削除
ID=Bは、atai=3※CDに111はないが、222があるので
※ID=Cは、111,222共にないので削除

記載が悪くても申し訳ございません。
よろしくお願いいたします。

お礼日時:2018/05/15 16:44

ゲンタ君です。

勝手ながら書き込みます。
採用するもしないもあなたの勝手です。

SELECT * FROM テーブルA WHERE CD = "111" OR CD = "222"
AND NOT EXISTS(SELECT * FROM テーブルA WHERE CD = "111")
    • good
    • 0
この回答へのお礼

採用しません!!ありがとうございました!!

お礼日時:2018/05/15 16:45

「CD=111とCD=222の両方の値もっていることがある」


この秘密をちゃんと説明しないと皆さんチンプンカンプンだと思いますよ。
名探偵がここを見ている確率は非常に小さいです。
    • good
    • 0
この回答へのお礼

コナン君を待ちたいと思います。
ゲンタ君は、黙って私と一緒にまっててください。

お礼日時:2018/05/15 13:48

>CD=111が「なかったら」CD=222



そう言う見方でなく、全レコードから「CD=111 かつ CD(C?)=222」を除いた集合体から「CD=111またはC=222」を抽出すると考えるとよいかと思います。排他論理和ですね。


演算子に排他論理和(XORやEOR)が使えれば簡単なのですが、ベタに書くと

where (CD="111" OR C="222") AND NOT(CD="111" AND C="222");

になりますがでどうでしょうか? 
※同じ結果となる記述はいくつかあります。

AccessはXORが使えますので、XORを使う場合は

where CD="111" XOR C="222";

です。
    • good
    • 0
この回答へのお礼

if分で、CD=111 がなかったら、CS=222を探す!!ってできないのでしょうか。。。

SQL(だけじゃないですけど)全くの素人で申し訳ございません。。。。

お礼日時:2018/05/15 13:49

まず、C=222ではなく、CD=222ではないのでしょうか?


その場合、あるレコードのCDの値が222だったときには必ず「111ではない」ということになります。

ならば、抽出は条件は 「CDが”111”または”222”」でよいので OR (論理和) を使えばよいです。

where CD="111" OR CD="222"

という感じです。

C=222の場合はもっと条件が増えると思いますが、基本的には論理演算で絞り込んでいきます。
    • good
    • 0
この回答へのお礼

ご連絡ありがとうございます。CD=111とCD=222の両方の値もっていることがあるので、
CD=111が「なかったら」CD=222という形が欲しいのです。
※orではなく

よろしくお願いいたします。

お礼日時:2018/05/15 12:28

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

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