我正在研究的UDF(my_udf)将JobId作为参数,并返回一个不同候选人的表格(候选人ID)及其应用于该职位的相应分数。
现在我要显示所有候选人的列表,他们已应用的工作以及相应的分数。 所以我的查询是这样的:
select *
from JobANDCandidates jc
inner join Candidates c ON jc.candidateId = c.Id
inner join Jobs j on j.Id = jc.jobId
Cross apply my_udf(jc.JobId)
但是上面的查询花费了太多时间并且不正确。
我不知何故需要根据候选ID交叉应用于从UDF返回的行。
我试过了
CROSS APPLY my_udf(jc.JobId) fun ON/WHERE fun.candidateId = c.Id
,但ON子句或WHERE子句都不起作用。我收到编译错误。
请帮忙
答案 0 :(得分:0)
这应该有效:
select . . .
from JobANDCandidates jc inner join
Candidates c
on jc.candidateId = c.Id inner join
Jobs j
on j.Id = jc.jobId Cross apply
dbo.my_udf(jc.JobId) f
where c.id = f.candidateid
这假设TVF有一个名为candidateid
的列。否则,您可能必须使用别名f(candidateid, . . .)
指定。
注意:这可能不会对性能产生重大影响,因为查询仍然需要处理整个TVF。您可能希望允许该函数将候选ID作为参数。
答案 1 :(得分:0)
我建议将UDF重构为一个简单的视图,然后加入其中。索引将与视图一起应用,因此速度应该非常好。
恕我直言,当可以使用普通视图时,UDF对于这种类型的操作来说是过度的,特别是如果对可移植性有任何顾虑的话。