我这里有两个查询会生成相同的结果。 您认为哪个更好,或者它们完全相同。
查询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
答案 0 :(得分:2)
预测这一点并不容易。
一般情况下:SQL-Server是不是程序引擎一个接一个地处理语句,因为您已经在代码中设置了它。您告诉SQL-Server您想要什么,引擎将决定,实现此目的的最佳方式是什么。并且完成得非常好!根据统计信息,并行操作,内存使用情况,CPU或HD,这可能会因呼叫而异。
即使看起来像这样, CTE也不会像表那样处理。具有多个CTE的查询看起来像哦,选择此结果,而不是获取这些结果,现在让我们调用这些行,现在进入主查询!但引擎可能会决定完全不同的执行顺序。
在您的简单案例中,我假设引擎足够聪明,您的查询结构相同。
检查执行计划以查看更多详细信息。
你说:如果它们具有相同的EP结果,那么我们可以说它取决于用户哪个更适合他们?
为什么您的用户应该考虑查询的内部结构?这取决于你无法控制的许多因素!你甚至不能确定,下一个电话将与之前的电话相同......
我的强烈建议是:甚至不要试图超越引擎!其算法花费了数千小时......您应该考虑可读性和维护等问题......
答案 1 :(得分:1)
CTE基本上只是一次性视图。除了将CTE代码作为表表达式放入FROM子句之外,它几乎不会更快地进行查询。
您必须使用ISNULL(col_1, col_2)
代替ISNULL(col_1, col_2, col_1)
第一个查询是更好的选择,因为使用一个连接的简单查询比使用CTE具有更好的性能
详细了解CTE Here
答案 2 :(得分:0)
ISNULL
需要2个argumnets
COALESCE
我们可以传递多个参数
第一个查询与性能相比更好,因为它是简单的内连接,但第二个查询是一些不被视为
的查询