在查询中使用相同的函数两次(SQL Server)

Posted

技术标签:

【中文标题】在查询中使用相同的函数两次(SQL Server)【英文标题】:Using the same function twice in a query (SQL Server) 【发布时间】:2010-01-29 10:23:37 【问题描述】:

在 SQL Server 2005 中,当我编写类似的查询时

SELECT m.*, a.price p1, b.price p2
FROM mytable m
LEFT JOIN products_table_1 a
ON my_hash_function(m.name) = a.hash
LEFT JOIN products_table_2 b
ON my_hash_function(m.name) = b.hash

my_hash_function(m.name) 是计算两次还是只计算一次?如果两次,我该如何使用变量来避免这种情况?

【问题讨论】:

【参考方案1】:
select  mm.*, a.price p1, b.price p2 from   
    (SELECT m.*, my_hash_function(m.name) as name
    FROM mytable m) mm
    LEFT JOIN products_table_1 a
    ON mm.name = a.hash
    LEFT JOIN products_table_2 b
    ON mm.name = b.hash

【讨论】:

哦,我明白了。谢谢!不知道会不会执行两次? 我认为这取决于优化器的推理。我不知道,但我想它不会。【参考方案2】:

执行计划显示它确实被执行了两次。但这仅在函数不是确定性 时才成立。为了使函数具有确定性,它必须定义WITH SCHEMABINDING 选项,并且它调用的所有函数也必须是确定性的。在我将哈希函数定义为确定性之后,计划发生了变化。现在它只执行一次!

但是,如果您不想打扰这些东西,momobo 的解决方案也同样有效。

【讨论】:

以上是关于在查询中使用相同的函数两次(SQL Server)的主要内容,如果未能解决你的问题,请参考以下文章

SQL 查询优化:在事实表中两次使用相同指标的最佳方法是啥?

SQL Server聚合函数

是否可以使用 SQL Server 使用相同的数据透视列进行多个数据透视

SQL Server:使用具有相同 OVER 子句的多个聚合/分析函数?

从 SQL Server 中的两个表中删除

我有 4 个 SQL Server 表,我使用相同的主键,我需要在条件 SQL 查询下