Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 大量使用ISNULL与嵌套SELECT_Sql_Sql Server_Tsql - Fatal编程技术网

Sql 大量使用ISNULL与嵌套SELECT

Sql 大量使用ISNULL与嵌套SELECT,sql,sql-server,tsql,Sql,Sql Server,Tsql,我想知道这两种说法在性能方面是否相同: 报表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

我想知道这两种说法在性能方面是否相同:

报表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左连接T2。但它真的很慢吗?或者SQL Server有没有办法对它们进行优化并使它们等效


问题是,第一种编写方法在左连接中有多个列要使用时可能会变得非常糟糕,而第二种方法将丑陋限制在嵌套的SELECT上。

另一种编写查询的方法是两个子查询的
并集,具有更简单的连接条件,并且不使用
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

在这两条语句中,
ISNULL(T2.COL1,T1.COL1)
可以简单地写为:
T1.COL1
,这是正确的!我写的时候把它简化了。我编辑了我的问题并更改了ISNULL语句中的列。您也可以将其重写为两个类似(但条件更简单)查询的联合。