在SO中比较Scalar函数和子查询时几乎没有类似的问题,但我的问题是针对以下用例的。我有一个EXISTS
条款,我想转到标量函数。是否会产生额外的性能成本?据我所知(这可能是错误的)EXISTS
这里无论如何都会涉及标量函数也会执行的另一个查询。
这是我拥有的
select *
from
A
where
not exists(select 1 from B where B.some_id = A.some_id and B.something = 'x')
我想将其更改为
create function does_exist_in_B (@some_id int) returns bit as
begin
declare @does_exist bit = 1
if not exists(select 1 from B where B.some_id = @some_id and B.something = 'x')
set @does_exist = 0
return @does_exist
end
select *
from
A
where
does_exist_in_B(A.some_id) = 0
我喜欢使用函数的原因是这个检查需要在其他几个地方重复,我想将这个逻辑保存在一个地方(出于显而易见的原因)。那我该怎么办呢?表值函数会不会有任何区别?