Использование одной и той же функции дважды в запросе (SQL Server) - PullRequest
6 голосов
/ 29 января 2010

В 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) рассчитывается дважды или только один раз? Если дважды, как я могу использовать переменную, чтобы избежать этого?

Ответы [ 2 ]

7 голосов
/ 29 января 2010
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
3 голосов
/ 05 февраля 2010

План выполнения показывает, что он действительно выполняется дважды. Но это верно, только если функция не является детерминированной . Чтобы функция была детерминированной, должна быть определена опция WITH SCHEMABINDING, и все функции, которые она вызывает, также должны быть детерминированными После того, как я определил хеш-функцию как детерминистическую, план изменился. Теперь он выполняется только один раз!

Однако, если вы не хотите беспокоиться об этом, решение momobo работает так же хорошо.

...