web-dev-qa-db-ja.com

内部結合の前にWHERE句を実行する方法

このようにクエリを実行するにはどうすればよいですか?

select Distinct  Station  , Slot , SubSlot, CompID , CompName 
from DeviceTrace as DT DT.DeviceID = '1339759958' 
inner join CompList as CL  
where  and DT.CompID = CL.CompID

内部結合を開始する前に、DT.DeviceID = '1339759958'を実行する必要があります。私はSQLサーバーを使用しています。

5
Night Walker

それが何か違いを生むとは信じがたいです。クエリオプティマイザーは、結合がより効率的であると計算した場合、結合の前に述語を適用する必要があります。これを行う必要がある唯一の状況は、オプティマイザーが誤った選択を行った場合です(少なくとも内部結合の場合-外部結合には有効なケースがあります)。

9
David Aldridge

ON句を追加してみてください。

SELECT DISTNCT Station, Slot, SubSlot, CompID, CompName 
FROM   DeviceTrace AS DT INNER JOIN CompList AS CL 
        ON  DT.CompID = CL.CompID AND
            DT.DeviceID = '1339759958'

この場合、INNER JOINを実行しているため、結果は同じです。 ON句に条件を追加することは、LEFT JOINを実行し、右側のテーブルでフィルタリングする場合とは大きく異なる可能性があります。

5
John Woo

サブクエリを使用して、whereの前にjoin句を適用できます。

select  *
from    (
        select  *
        from    DeviceTrace
        where   DeviceID = '1339759958' 
        ) as DT 
inner join 
        CompList as CL  
on      DT.CompID = CL.CompID

この場合、サブクエリ、on句、または最後のwhereでフィルタリングするかどうかは重要ではありません。

1
Andomar

デビッドオルドリッジから答えるための小さな説明。クエリを使用する必要があります

select Distinct  Station  , Slot , SubSlot, CompID , CompName 
from DeviceTrace as DT 
inner join CompList as CL on DT.CompID = CL.CompID  
where DT.DeviceID = '1339759958'
1
Roman Podlinov