簡體   English   中英

在聯接中使用表值函數

[英]Using Table valued Function in join

有一個表值函數,該函數給出多行作為輸出,有2列作為輸出。

現在,我想在查詢中使用此函數為employees表中的所有employee

我正在使用CROSS APPLY,但是它花費了很長時間,並且沒有得到任何結果。

這是我嘗試過的查詢

select *
from emp A Cross APPLY fnempDiv(A.EmpID)

我正在使用CROSS APPLY

  • 需要很長時間

不幸的是,這是CROSS APPLY的本質,因為它是逐行運算符。 它非常適合一些員工行(方便),但從您的描述來看,對於此查詢,應避免使用它,並將APPLY中的查詢擴展到外部查詢。 一個簡單的INNER JOIN應該可以。

  • 沒有任何結果。

CROSS APPLY從APPLY中刪除不產生任何行的emp A記錄。 OUTER APPLY將保留emp A記錄。 如果總體上獲得0條記錄,則可能是傳遞了錯誤的列,例如A.EmpID不是正確的鍵。

如果函數是這樣定義的(根據您的評論):

CREATE FUNCTION dbo.fnempDiv(@EmpID)
RETURNS TABLE AS RETURN
 SELECT A.EmpID,D.Name
 FROM empdetail A
 INNER JOIN empdiv D on A.empID=D.ID
 where EXISTS (select * from X)
GO

這根本沒有意義。 Select * from X或是發生故障,整個查詢或成為啞彈的條件,只需通過在創紀錄的X或以其他方式。 也未使用輸入參數@EmpID

另一方面,如果聲明如下:

CREATE FUNCTION dbo.fnempDiv(@EmpID)
RETURNS TABLE AS RETURN
 SELECT A.EmpID,D.Name
 FROM empdetail A
 INNER JOIN empdiv D on A.empID=D.ID
 where A.EmpID = @EmpID
GO

然后,您的完整查詢可以被重寫

select E.*, A.emp_ID as EmpDetail_Emp_ID, D.Name
from emp E
INNER JOIN empdetail A ON E.emp_ID=A.EMP_ID
INNER JOIN empdiv D on A.empID=D.ID

此外,連接A.empID=D.ID甚至看起來都不正確。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM