Используя ту же функцию дважды в запросе (SQL Server)

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

6
задан ercan 5 February 2010 в 13:11
поделиться

2 ответа

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

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

3
ответ дан 10 December 2019 в 00:38
поделиться
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
7
ответ дан 10 December 2019 в 00:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: