有一個表值函數,它將多行作爲輸出,並且有2列作爲輸出。在連接中使用表值函數
現在我想在查詢中使用此功能在員工表
我使用CROSS APPLY所有的員工,但其採取很長一段時間,不給任何結果。
這是我嘗試
select *
from emp A Cross APPLY fnempDiv(A.EmpID)
有一個表值函數,它將多行作爲輸出,並且有2列作爲輸出。在連接中使用表值函數
現在我想在查詢中使用此功能在員工表
我使用CROSS APPLY所有的員工,但其採取很長一段時間,不給任何結果。
這是我嘗試
select *
from emp A Cross APPLY fnempDiv(A.EmpID)
我使用CROSS APPLY查詢
不幸的是,這是CROSS的特性,來套用,因爲它是一個逐行的運算符。它適用於少數員工行(方便),但從描述的內容來看,您應該避免使用此查詢,並將APPLY中的查詢擴展到外部查詢。一個簡單的INNER JOIN應該做。
CROSS APPLY刪除emp A
記錄,該記錄不會從APPLY生成任何行。 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
甚至不看的權利。
你能告訴我如何在內部連接的幫助下做到這一點。 – user1599392
顯示功能碼;編輯問題 – RichardTheKiwi
SELECT A.EmpID,D.Name \t FROM empdetail一個INNER JOIN上A.empID = D.ID \t empdiv d其中EXISTS(SELECT * FROM X) – user1599392
'emp'表中有多少行? 'select * from fnempDiv([某個EmpID])'返回多少行? –
你必須給我們近似計數,或嘗試與nolock檢查是否有任何其他交易被阻止 –
@Kumar如果它被封鎖,它仍然會完成並返回與行一旦塊清除 – RichardTheKiwi