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は奥が深い。