2010-01-29 81 views
5

在SQL Server 2005中,当我写这样在查询中使用相同功能的两倍(SQL Server)的

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)计算两次或只有一次?如果两次,我如何使用一个变量来避免这种情况?

回答

2

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

但是,如果你不想打扰那些东西,momobo的解决方案也可以。

7
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 
+0

哦,我明白了。谢谢!你知道它是否会被执行两次否则不? – ercan 2010-01-29 10:32:44

+0

我认为这取决于优化器的推理。我不知道,但我想它不会。 – momobo 2010-01-29 10:47:15