あんにんにっき。

日々思ったことや、おこったことを記録するブログ。要するに日記。

DISTINCTは駄目だ、EXISTSを使うのだ。

 SQLの速度アップの話で、DISTINCTを使って重複排除するのは遅いので、EXISTSを使え、という話を聞いて知ってはいたのだけど、なんでEXISTSを使うと重複排除できるのか分らなかった。
 どうやら、こんな感じ。

顧客マスタ
A
B
C
商品マスタ
X
Y
Z
とあるとき、
販売テーブルが
A-X
A-Y
A-X
B-Y
B-Z
B-Z
とあるとき、
販売テーブルの、一回でも売れたことのある商品、という意味で重複排除する場合、

SELECT DISTINCT 商品 FROM 販売テーブル
って、感じでやるほかに、
SELECT 商品 FROM 商品マスタ
WHERE EXISTS (SELECT 商品 FROM 販売テーブル, 商品マスタ
WHERE 販売テーブル.商品 = 商品マスタ.商品)
 って感じにできるらしい。まず、商品マスタに検索に行って、EXISTSの対象が販売テーブル、って事みたい。
 ところが、ほしい結果が、顧客-商品の組み合わせのDISTINCTの場合、当然顧客-商品の組み合わせのマスタが必要になったりするわけで。そういうのが無い時はやっぱりDISTINCT? それとも組み合わせのテーブルを作るのが正解?
 うーむ。SQLは奥が深い。