始めに
SQLのDISTINCTはEXISTSとかGROUP BYで代用する事もできます。(DISTINCTは暗黙的なソートがされますが…)
重複行を削除するのがDISTINCTであり、GROUP BYは集合演算です。
いずれを使うにせよ劇的に差が出るほどでもないですが。
個人的にはDISTINCTを使える条件の方が目くらでもさらっと分かるので好きです。
しかし諸事情で使えないケースもあるため手数は増やしておきたい。
基本的にGROUP BY使えば終わりですが、適当にEXISTSでの代替ソース書くとこんな感じです
1 2 |
SELECT a._cd, a._name FROM dev_table1.a WHERE EXISTS ( SELECT dev_sub FROM dev_table2.b WHERE a._cd = b._cd) |
正直サブクエリの実行順位はdbのバグ踏んだり、オプティマイザ理解しないで適当に作ると重くなるのでう〜ん(笑)となった事が数々ありました。
existsの利用は正直微妙でデータのカーディナリティによってindexが利用されずフルスキャンになるケースが見受けられます。
過去にexistsを廃止してjoinとorder byを利用することでオプティマイザのindex利用の見解と一致した事がありました。
GROUP BY句はこれはこれで余分なディスクIOが発生したりディスク領域利用したり懸念するところが出てきます…
SQLは使ってるDBのバージョンによってオプティマイザの見解とか眉唾が結構あるのでしんどいですね。
所詮ケースバイケースなので、程度のレスポンスを気にした書き方にしたら実装後にサイジングとか負荷試験を行って、その環境のベストエフォートを探すのが近道なんですよねー。
とは言え
今回はレスポンスとかが問題じゃなくて、使ってた製品がWHERE以下しかSQLを記述することが出来なくてDISTINCTの代わりを探していただけです。(*^-^)ノ
もっと冴えた方法もあるかなと
集計情報の出力に関してはこちらもどうぞ