我想知道这两个陈述在性能方面是否相同:
声明1:
SELECT
ISNULL(T2.COL4, T1.COL4)
FROM
T1 LEFT JOIN T2 ON T1.COL1 = T2.COL1
JOIN T3 ON T2.COL1 IS NULL AND T3.COL2 = T1.COL2 OR T3.COL2 = T2.COL2
WHERE
T3.COL3 = @COL3
声明2:
SELECT
T1.COL4
FROM
(SELECT
ISNULL (T2.COL4, T1.COL4) COL4,
ISNULL (T2.COL2, T1.COL2) COL2
FROM T1 LEFT JOIN T2 ON T1.COL1 = T2.COL1) T1
JOIN T3 ON T1.COL2 = T3.COL2
WHERE
T3.COL3 = @COL3
这两个语句在功能上是等效的(不是吗?)但常识会建议第二个语句较慢,因为我们在应用WHERE子句之前“枚举”T1 LEFT JOIN T2。但它真的更慢还是SQL Server有办法优化它们并使它们等效?
事情是第一种写作方式,当你从左连接中使用多个列时,它会变得非常讨厌,而第二种方式只会将丑陋限制在嵌套的SELECT中。
答案 0 :(得分:1)
编写查询的另一种方法是UNION
两个子查询,其中包含更简单的Join条件且不使用ISNULL()
函数:
SELECT
T2.COL4
FROM
T1
JOIN T2 ON T1.COL1 = T2.COL1
JOIN T3 ON T3.COL2 = T2.COL2
WHERE
T3.COL3 = @COL3
UNION ALL
SELECT
T1.COL4
FROM
T1
LEFT JOIN T2 ON T1.COL1 = T2.COL1
JOIN T3 ON T3.COL2 = T1.COL2
WHERE
T2.COL1 IS NULL
AND
T3.COL3 = @COL3