4

apply & joinキーワードの使用に関する記事を読んでいました。ある例では内部結合を使用し、他の例では apply キーワードを使用している SQL を参照してください。

ここにテーブルの写真があります

ここに画像の説明を入力

SELECT E.EMPID, E.NAME, E.DEPTID, D.NAME 
FROM EMPLOYEE E 
INNER JOIN  DEPARTMENT D ON E.DEPTID = D.DEPTID

SELECT E.EMPID, E.NAME, E.DEPTID, CA.NAME 
FROM EMPLOYEE E
CROSS APPLY
    (SELECT * FROM DEPARTMENT D WHERE D.DEPTID = E.DEPTID) CA  

どちらのクエリも同じ出力と同じ実行プランを返します。これが写真です

ここに画像の説明を入力 ここに画像の説明を入力

再び外部適用と左外部結合を使用します

SELECT E.EMPID, E.NAME, E.DEPTID, D.NAME 
FROM EMPLOYEE E 
LEFT JOIN  DEPARTMENT D ON E.DEPTID = D.DEPTID

SELECT E.EMPID, E.NAME, E.DEPTID, OA.NAME 
FROM EMPLOYEE E
OUTER APPLY
    (SELECT * FROM DEPARTMENT D WHERE D.DEPTID = E.DEPTID) OA

ここでも、両方のクエリが同じ出力と同じ実行計画を生成します。ですから、どのような状況で内部結合または左外部結合の代わりに使用する必要があるのか​​\u200b\u200bわかりませんOUTER APPLYCROSS APPLY

可能であれば、OUTER APPLY or CROSS APPLY感謝を使用する必要がある同じシナリオが付属しています

4

2 に答える 2

5

JOIN として書き換えることができない APPLY の例を次に示します。

SELECT ...
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st

APPLY で相関関係の JOIN と考えることができます。JOIN は相互関係を許可しません。結合された 2 つの関係は独立している必要があります。たとえば、次は正しくありません。

select * 
from sys.objects o1
join (
    select * 
    from sys.objects o2
    where o1.object_id = o2.object_id) as o3
on 1=1;

Msg 4104, Level 16, State 1, Line 6
The multi-part identifier "o1.object_id" could not be bound.

ただし、同じことを APPLY として表現できます。

select * 
from sys.objects o1
cross apply (
    select * 
    from sys.objects o2
    where o1.object_id = o2.object_id) as o3;

o1.object_id APPLYは相関を許可するため、サブクエリで使用できます。最も重要な使用例は、元の例のようにテーブル値関数です。これは、APPLY を使用すると「メイン」テーブルの列をパラメーターとして関数に渡すことができるためです。

CROSS APPLY と OUTER APPLY の違いは、JOIN の場合とまったく同じです。OUTER の場合は、一致しない行(APPLY が空の結果セットを返す) が返され、対応する内部テーブルの列に NULL が含まれます。

于 2014-03-18T11:27:06.127 に答える