言葉のさんぽ道

~気ままに写真とゲームの話題が更新されるはず~

Oracle SQL not inな検索を軽くする方法

今回もお仕事上で解決した方法をご紹介。
・AテーブルのAAカラムの値がBテーブルのBBカラムの値にないこと
簡単そうで意外と面倒なこの条件。さくっとやろうとすると A.AA not in ( select B.BB from B ) なんてことになるかもしれない。
でもそんな事するとAとBの間でフルアクセスが起こるのでデータが大量になると大変なことになってしまう。


どうしたもんかなこれ…軽くしたいんだけど…。と悩んでいた所、解決方法を思いついた。
そうだ、外部結合してしまえばいいじゃない!


そう、A.AAとB.BBで外部結合して、nullになったのが必要な情報だ!というわけ。これならインデックスも効くだろうしでハッピーになれたよ!


以下簡単な例。
(困ったSQL
select A.ID from AHO A
where A.ID not in ( select B.ID from BAKA B )

(解決SQL
select A.ID from AHO A
left outer join BAKA B on A.ID = B.ID
where B.ID is null