SQL查询-它们是相同的吗?
这里有两个查询将生成相同的结果。 你认为哪一个更好?或者它们完全一样 问题1SQL查询-它们是相同的吗?,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
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个参数
合并
我们可以传递多个参数
与性能相比,第一个查询更好,因为它是简单的内部联接,但第二个查询并没有考虑到
ISNULL(col\u 1,col\u 2)
而不是ISNULL(col\u 1,col\u 2,col\u 1)
这是不容易预测的 一般来说: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。注意这一点(可读性和维护)