有效使用交叉申请?

时间:2013-08-23 18:23:46

标签: sql sql-server

所以我有一个子查询,它将在三个不同的表上执行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)

当我执行CROSS APPLY时,当我限制表A中的行时,如果我执行了WHERE A.SomeCondition = T.SomeCondition,我是否能获得良好的性能。此表将具有比其他表更多的行。

1 个答案:

答案 0 :(得分: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)

然后开始查看查询计划并查看它为您的数据显示的内容。