2016-05-03 8 views
0

複数のジョインを持つクエリを実行するときに、SQLは優先順位に従います。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クエリ、知ることです。

+0

オプティマイザは、アクセスされるデータを最小限に抑えるために、JOINに関係なく、最初に最小限の行のテーブルを配置します。 – Mihai

+0

@Mihai、製品固有。インデックスなどを忘れないでください。 – jarlh

+0

SQL ServerまたはOracleについて質問していますか?関与していない製品にはタグを付けないでください。 – jarlh

答えて

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; 

DEPARTMENT

  • JOINは必要ありません。
  • サブクエリは、それが故に窓/分析関数

に置き換えることができ、不要なクエリの改良版でもないので、加入の処理の順序についての質問は、見当違いであります明示的にJOINがあります。しかし、答えは、オプティマイザがJOINの実行順序を決定することです。言語としてのSQLの意図は、宣言型ではなく、手続きであるということです。つまり、生成される結果を記述しますが、それがどのように行われるかは指定しません。

+0

DEPARTMENTへの結合は、無効な部門番号を持つEMPLOYEEレコードを排除します。 *いくつかの会社*(特定の従業員**(私に尋ねないでください! (私に尋ねないでください!:-) –

+0

'declarative';私の説明でそれを使用することを忘れてはなりません。 – MatBailie

+0

ゴードン、応答ありがとう。私が与えたSQLはほんの一例でした。より多くのジョインが使用される実際のシナリオはたくさんあります。 –

関連する問題