2016-11-09 6 views
1

私はいくつかのコードを最適化し、そしてようなクエリを思い付くよ:JOINedテーブルのどの部分も使用されていない場合は削除できますか?

SELECT 
    t.ID 
    MAX(CASE WHEN t.line=1 THEN zt.title ELSE NULL END) as primary_title 
    MAX(CASE WHEN t.line=2 THEN zt.title ELSE NULL END) as sec_title 
    MAX(CASE WHEN t.line=3 THEN zt.title ELSE NULL END) as tert_title 
    MAX(CASE WHEN t.line=4 THEN zt.title ELSE NULL END) as quat_title 
FROM table t 
     LEFT JOIN btable b on b.id=t.id 
     LEFT JOIN ztable zt on zt.id = b.id 
     LEFT JOIN dtable d on d.id = b.id -- Is not used, yet in execution plan, table is fully accessed and scanned, causing query to run much slower. 
WHERE t.line in(1,2,3,4) 
GROUP by t.id 

私が最後に参加することを削除した場合dtableには列が使用されていないので、私は、正しいどのような方法で結果をもたらすいませんよ?

私はいくつかのテストを行っていますが、参加の有無にかかわらず結果セットに違いは見当たりませんでしたが、専門家に相談したいだけでした。

ありがとうございます!

更新:固定タイプのdtable結合。

+0

"on d.b.id"とはどういう意味ですか? (それは無効な構文なので、おそらくタイプミスがありますが、どうすればよいでしょうか) – mathguy

+0

おっと、はい、タイプミスです。一定。ありがとう! – russds

+0

Gordonの答えに対するコメントで説明したように、最後の左結合によって、結果セットに重複していない行がある可能性があります。たとえば、(訂正された)結合条件がd.id = b.idであり、複数のd.idに一致するb.idがいくつか存在すると、結果の対応する行が複製されます。それ以外の変更はありませんが、結果に不必要な重複があります。 – mathguy

答えて

1

あなたはこの場合正しいです。しかし、3つの理由から、

  1. dtableからの列は参照されていません。
  2. 結合はLEFT JOINです。したがって、フィルタリングは行われません。
  3. 集計関数はMAX()です。そのため、重複は結果に影響しません。
+0

そうではありません。最後の結合の結合条件が複数回満たされているために重複がある場合、 'max()'は変更されませんが、結果には重複はありません。 – mathguy

+0

@mathguyありがとうございますが、結果はdtableのいずれの列でもMax()集計関数を使用しているため、クエリの結果は同じですか? – russds

+0

修正します。私が言ったことを決して気にしないで! – mathguy

関連する問題