SQL多连接中的执行优先级

时间:2016-05-03 11:28:37

标签: sql sql-server database oracle join

在执行具有多个连接的查询时,SQL是否遵循任何优先级。

示例查询

SELECT emp.ename, emp.DEPTNO, emp.JOB, emp.SAL 
FROM EMPLOYEE emp 
INNER JOIN DEPARTMENT Dept On emp.DEPTNO = Dept.DEPTNO
INNER JOIN (
    SELECT MAX(emp.sal) maxSal, emp.DEPTNO 
    FROM EMPLOYEE emp 
    GROUP BY emp.DEPTNO
    ) AS maxSalData
 ON emp.DEPTNO = maxSalData.DEPTNO AND emp.SAL = maxSalData.maxSal

我的问题是要知道,当存在多个连接时,如何执行SQL查询。

1 个答案:

答案 0 :(得分:4)

优化器确定连接的顺序。

我想要注意,有一种更简单的方法来编写查询:

SELECT emp.ename, emp.DEPTNO, emp.JOB, emp.SAL 
FROM (SELECT emp.*, MAX(emp.sal) OVER (PARTITION BY emp.DEPTNO) as maxsal
      FROM EMPLOYEE emp
     ) emp;

所以:

  • 不需要JOINDEPARTMENT
  • 子查询不是必需的,可以用窗口/分析函数替换

因此,关于连接处理顺序的问题是错误的,因为更好的查询版本甚至没有明确的JOIN。但是,答案是优化器确定JOIN的执行顺序。 SQL作为一种语言的意图是它是声明性,而不是过程。也就是说,它描述了要生成的结果,但没有说明如何完成。