在查询中使用相同的函数两次(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 使用相同的数据透视列进行多个数据透视