私はいくつかのコードを最適化し、そしてようなクエリを思い付くよ: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結合。
"on d.b.id"とはどういう意味ですか? (それは無効な構文なので、おそらくタイプミスがありますが、どうすればよいでしょうか) – mathguy
おっと、はい、タイプミスです。一定。ありがとう! – russds
Gordonの答えに対するコメントで説明したように、最後の左結合によって、結果セットに重複していない行がある可能性があります。たとえば、(訂正された)結合条件がd.id = b.idであり、複数のd.idに一致するb.idがいくつか存在すると、結果の対応する行が複製されます。それ以外の変更はありませんが、結果に不必要な重複があります。 – mathguy