2012-06-29 2 views
0

У меня есть запрос, который принимает скалярнозначную функцию 2 раза, в одном месте в поле внутри списка выбора и второе в условии соединения. Мой вопрос заключается в том, как избежать этого вызова функции в рамках одного запроса? Спасибо.SQL: Как избежать множественного вызова функции в одном запросе?

SELECT i.Id, i.Name, . . . . . dbo.IsItemCApproved(C.Id) AS [Status], . . 
FROM @Item i 
JOIN Card C ON C.ItemId = i.Id 
AND C.Deadline IS NOT NULL 
AND dbo.IsItemCApproved(C.Id) = 'False' 
AND C.IsDeleted = 0 
+1

Q: Пример SQL пожалуйста? В: Почему вы считаете, что вызов функции два раза в одном запросе обязательно Bad Thing? Если это требует утверждения, и это приводит к одному и только одному вызову на сервер, то это оптимальная вещь! – paulsm4

+0

Низкое качество, пожалуйста, укажите пример –

+0

вы можете поделиться образцом кода – Asif

ответ

1
Select * from 
(
SELECT i.Id, i.Name, . . . . . dbo.IsItemCApproved(C.Id) AS [Status], . . 
FROM @Item i 
JOIN Card C ON C.ItemId = i.Id 
AND C.Deadline IS NOT NULL 
AND C.IsDeleted = 0 
)A 
WHERE [Status] = 'False' 
2

Использование КТР

with cte 
as 
(
    select 
     id, 
     calculated = myFunction(field1, field2) 
    from 
     table1 
) 
select 
    id, 
    field1, 
    field2, 
    calculated 
from 
    table1 
inner join 
    cte on cte.id = table1.id 
where 
    cte.calculated = @someCondition 

Или Sub-опрос

select 
    id, 
    field1, 
    field2, 
    calculated 
from 
(
    select 
     field1, 
     field2, 
     calculated = myFunction(field1, field2) 
    from 
     table1 
) t 
where 
    calculated = @someCondition 
Смежные вопросы