2013-08-23 40 views
-1

所以我有一個子查詢,它將在三個不同的表上執行LEFT JOIN。然後,我有一個第四個表,它加入了一個id,我之前加入的三個表中的其中一個將包含該表。交叉應用的有效使用?

SELECT 
(
    IIF 
    ( 
    NOT EXISTS(
     SELECT * FROM A 
     LEFT JOIN B ON 
      (A.Col1 = B.Col1) 
     LEFT JOIN C ON 
      (A.Col2 = C.Col2) 
     LEFT JOIN D ON 
      (A.Col3 = D.Col3) 
     LEFT JOIN E ON 
      (B.SomeID = E.SomeID) 
      OR 
      (C.SomeID = E.SomeID) 
      OR 
      (D.SomeID = E.SomeID) 
     WHERE A.SomeCondition = T.SomeCondition 
     1, 
     0 
) AS SomeCol 
FROM T 
WHERE T.Col1 = (some condition) 

我會在性能benifit如果我做了CROSS APPLY當我限制對錶A中的行,當我做WHERE A.SomeCondition = T.SomeCondition。這個表格將有更多的行,然後是其他表格。

+1

從4個表中刪除'select *'將有助於提高性能。 –

+0

是的,但這不是問題。 –

+1

這是否運行?你如何將一個'Select *'輸入到一列,'SomeCol'中? – Brad

回答

1

即使表E不匹配,該代碼也會返回數據。

而不是

LEFT JOIN E ON 
    (B.SomeID = E.SomeID) 
    OR 
    (C.SomeID = E.SomeID) 
    OR 
    (D.SomeID = E.SomeID) 

你可以嘗試:

INNER JOIN E on e.id = coalesce(B.SomeID, C.SomeID, D.SomeID) 

然後開始尋找查詢計劃,看看它顯示了你的數據。