如果没有使用JOINed表的任何部分,是否可以将其删除?

时间:2016-11-09 21:26:28

标签: sql oracle oracle12c

我正在优化一些代码,并提出如下查询:

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连接上修复类型。

1 个答案:

答案 0 :(得分:1)

在这种情况下,你是对的。但有三个原因:

  1. 未引用dtable中的列。
  2. 联接是LEFT JOIN s,因此他们没有进行任何过滤。
  3. 聚合函数为MAX(),因此重复项对结果没有影响。