在查询中使用相同的函数两次(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)的主要内容,如果未能解决你的问题,请参考以下文章