今回もお仕事上で解決した方法をご紹介。
・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