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

以下のような2つのテーブルがあったとします。
顧客テーブルでユーザ名に"/"を含んだユーザのなかで、ユーザIDが住所テーブルに存在しないレコードを抽出するSQLを書くにはどうすればいいのでしょうか?

<顧客テーブル>
ユーザID ユーザ名
1 A/B
2 CD
3 E/F

<住所テーブル>
ユーザID 住所
1 GGG
2 HHH

<抽出結果>
ユーザID ユーザ名
3 E/F

A 回答 (2件)

>not exists



以前はexists超高速神話がありましたねぇ・・・
今はそうでもないんじゃないかと思います
インデックスを設定して、テストしてみたのですが
どちらのSQLも同じ効率のようです

ちょっと調べたらこんなところがヒットしました
http://kkoudev.github.io/blog/2013/09/14/sql/

left joinしてnullチェックの方が優勢との見方をしているようです。
    • good
    • 0
この回答へのお礼

not existsが必ずしも速いわけじゃないんですね。。。
大変参考になりました。ありがとうございます!

お礼日時:2016/01/08 19:39

具体的に想定しているSQLは有りますか?


例えばこんな感じ

//顧客テーブル
create table kokyaku(uid int,uname varchar(20));
insert into kokyaku values(1,'A/B'),(2,'CD'),(3,'E/F');

//住所テーブル
create table jusho(uid int,jusho varchar(200));
insert into jusho values(1,'GGG'),(2,'HHH');

//結果
select k.uid,k.uname from kokyaku as k
left join jusho as j on k.uid=j.uid
where k.uname like '%/%'
and j.uid is null

※ただしlikeの前方後方一致はスピードが遅い
    • good
    • 0
この回答へのお礼

顧客テーブルと住所テーブルは記載していただいたとおりで、結果出力としてこんなSQLを想定していました。
select * from kokyaku where kokyaku.uname like '%/%' and not exists (select * from jusho where
kokyaku.id = jusho.uid )
これで問題なければ、これを使おうかと考えていたのですが。。。

お礼日時:2016/01/08 13:40

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