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

ver3.23のMySQLとPerlでデータベースを作っています。
検索方法でちょっと詰まってしまったので、
質問させていただきます。


以下のようなテーブルがあるとします。

tableA(基本名簿)
AID name sr
1  aaa 100
2  bbb 100
3  ccc 100
4  ddd 100
5  eee 100
6  fff 200

tableB(対応履歴)
BID cr
1  40
1  50
1  60
3  40
3  50
3  60

AIDはBIDに対応します。
ここでやりたいのは、
「'sr'が100であり、なおかつ'cr'が40ではない(結合後のテーブルにおいてnullである)tableAのレコードを取り出す」
ということです。

以下のような結果が理想です。
AID name cr  sr
2  bbb null 100
4  ddd null 100
5  eee null 100

いろいろ試した結果、
AID name cr  sr
1  aaa 40  100
2  bbb null 100
3  ccc 40  100
4  ddd null 100
5  eee null 100
このような結果が出る段階まではたどり着きました。
以下がそのコードです。
SELECT * FROM tableA as A left join tableB as B
on A.AID = B.BID and cr =40
WHERE sr = 100
order by AID

以上のような結果が出たので、
三行目に"and cr != 40"や"and cr = null"などを足してみたのですが、
結果はemptyでした。

NOT EXISTSを最初は試みたのですが、
よく読んだらバージョンが古くて使えませんでした。
混乱しすぎて何か基本的な事をおろそかにしている気もするのですが…

わかる方いらっしゃいましたらぜひご教示くださいませ。

A 回答 (1件)

第一に3.23はサポート終了バージョンなので自己解決できないなら


使用を中止すべきです。
今回の件については普通はサブクエリを使えば出来ますが、
3.23系ということでテンポラリをつかって処理します。
またnullは等号ではなくisで判断します。

create temporary table tableC select BID from tableB WHERE cr=40;
SELECT * FROM tableA as A left join tableC as C on A.AID = C.BID WHERE sr =100 and BID is null;
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。

>第一に3.23はサポート終了バージョンなので自己解決できないなら
使用を中止すべきです。

まずご忠告ありがとうございます。
他でもバージョンアップした方が良い局面が何回かあったので、
諮ってみたいと思います。

>またnullは等号ではなくisで判断します。
これは迂闊でした…。
アドバイスいただいたおかげでうまくいきました。
ありがとうございました。

お礼日時:2010/02/13 14:39

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