加入表值函数

时间:2017-04-18 15:58:47

标签: sql sql-server

我正在研究的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子句都不起作用。我收到编译错误。

请帮忙

2 个答案:

答案 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对于这种类型的操作来说是过度的,特别是如果对可移植性有任何顾虑的话。