2017-04-18 47 views
1

我正在使用的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

所以查詢沒有返回正確的結果?也許你應該在影響表演之前解決這個問題。我們在這裏確實幫不了忙,因爲在這一點上沒有任何細節。表格定義和功能至少。這裏是一個開始的好地方。 http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/ –

+0

也許交叉應用需要反對子查詢...'交叉apply(select * from my_udf(jc.jabID)''或者你需要一個where cluase來指定你的UDF如何與其他記錄相關? – xQbert

+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作爲參數。

+0

謝謝你的回覆但查詢仍然需要大量的時間ime作爲候選人表如果巨大。我想我將不得不創建一個接受canidateId的新UDF。 – Manali

0

我建議重構UDF作爲一個簡單的視圖,並加入到此。索引將與視圖一起應用,所以速度應該非常好。

恕我直言,當可以使用普通視圖時,UDF對於這種類型的操作來說是矯枉過正的,特別是如果有任何關於可移植性的擔憂的話。