-1

所以我有一个子查询,它将LEFT JOIN在三个不同的表上执行。然后我有第四个表,它加入了一个 id,我之前加入的三个表中的一个表将包含该 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?该表的行数将明显多于其他表。

4

1 回答 1

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)

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

于 2013-08-23T18:35:29.067 回答