Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.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/25.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查询-它们是相同的吗?_Sql_Sql Server_Common Table Expression - Fatal编程技术网

SQL查询-它们是相同的吗?

SQL查询-它们是相同的吗?,sql,sql-server,common-table-expression,Sql,Sql Server,Common Table Expression,这里有两个查询将生成相同的结果。 你认为哪一个更好?或者它们完全一样 问题1 SELECT ISNULL(col_1, col_2) AS col_1 FROM table_1 INNER JOIN table_2 ON table_2.col = ISNULL(col_1, col_2) 或问题2 WITH cte_table_1 AS ( SELECT ISNULL(col_1, col_2) AS col_1 FROM table_1 ) SE

这里有两个查询将生成相同的结果。 你认为哪一个更好?或者它们完全一样

问题1

SELECT
    ISNULL(col_1, col_2) AS col_1
FROM table_1
INNER JOIN table_2 ON table_2.col = ISNULL(col_1, col_2)
或问题2

WITH cte_table_1 AS
(
    SELECT
         ISNULL(col_1, col_2) AS col_1
    FROM table_1
)

SELECT
    cte_table_1.*
FROM cte_table_1
INNER JOIN table_2 ON table_2.col = col_1

ISNULL
需要2个参数

合并
我们可以传递多个参数

与性能相比,第一个查询更好,因为它是简单的内部联接,但第二个查询并没有考虑到

  • CTE本质上只是一个一次性视图。除了将CTE代码作为表表达式放入FROM子句之外,它几乎不会使查询变得更快

  • 您必须使用
    ISNULL(col\u 1,col\u 2)
    而不是
    ISNULL(col\u 1,col\u 2,col\u 1)

  • 第一个查询是更好的选择,因为使用一个联接的简单查询比使用CTE具有更好的性能

  • 阅读更多关于CTE的信息


  • 这是不容易预测的

    一般来说:SQL Server不是一个过程引擎,一个接一个地处理语句,正如您在代码中设置的那样。您告诉SQL Server您想要什么,引擎将决定实现这一点的最佳方法。而且这做得很好根据统计数据、并行操作、内存使用情况、CPU或HD,每次调用可能会有所不同

    即使看起来像这样,CTE也不像表那样处理。带有多个CTE的查询看起来像哦,选择这个结果,而不是获取这些,现在让我们调用这些行,现在进入主查询!但是引擎可能会决定完全不同的执行顺序

    在您的简单示例中,我假设引擎足够智能,可以看到您的查询在结构上是相同的

    查看执行计划以查看更多详细信息

    更新 你说:如果他们有相同的EP结果,那么我们可以说,这取决于用户谁对他们更好,什么对他们更可取

    用户为什么要考虑查询的内部结构?这取决于许多你无法控制的因素!你甚至不能确定下一个电话是否与前一个相同


    我的强烈建议是:甚至不要尝试智能引擎在算法上花费了数千小时。。。您更应该考虑可读性和维护等问题。

    运算符
    为NULL
    与函数
    为NULL()
    “CTE不应用于性能。”:-想解释一下那句话吗?很抱歉,我写得太快了,我把它删掉了。@Mitchwheat前两行不相关。其余的都错了。在计划或执行方面极不可能有任何差异。(第二个查询是什么意思?
    第二个查询是什么意思?)看看starting,他在isnull()中传递了三个参数,所以在isnull的位置,请传递coalesce我发布的..@martinsmith检查执行计划。如果这两个语句产生完全相同的计划,我不会感到惊讶。你最好学习执行计划等工具,而不是问多个“这两个查询如何比较”的问题。没错。。展望未来,最好使用合并备注:对于(1),正确的术语是
    派生表
    ;对于SQL Server上的(2),通常首选
    ISNULL
    <代码>合并
    有副作用。我使用ISNULL(col_1,col_2)作为基本示例。如果我把它改成一个复杂的,逐案的情况,我应该把它重复到where子句,还是用语句把它们框起来。如果变得复杂了。您必须检查两个估计执行计划Yep。。EP将给出答案。但我想知道更多的细节。顺便说一句,谢谢。是的!执行计划将说明更多细节。我认为这个案例有一个简单的解释,而不是阅读EP。@Alvinasatos不,没有。。。我假设,引擎将能够将cte_table_1作为(从table_1中选择ISNULL(col_1,col_2)作为col_1)完全内联到其余部分。如果您想大致了解这一点以预测类似但更复杂查询的行为,这将导致您陷入黑暗。。。在现实世界的场景中,事情不会那么容易…例如,如果他们有相同的EP结果,那么我们可以说,这取决于用户,哪个对他们更好,哪个对他们更好?或者这取决于rest查询的复杂性。非常感谢Shinogo。注意这一点(可读性和维护)