2012-10-11 53 views
1

有一個表值函數,它將多行作爲輸出,並且有2列作爲輸出。在連接中使用表值函數

現在我想在查詢中使用此功能在員工表

我使用CROSS APPLY所有的員工,但其採取很長一段時間,不給任何結果。

這是我嘗試

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

'emp'表中有多少行? 'select * from fnempDiv([某個EmpID])'返回多少行? –

+0

你必須給我們近似計數,或嘗試與nolock檢查是否有任何其他交易被阻止 –

+0

@Kumar如果它被封鎖,它仍然會完成並返回與行一旦塊清除 – RichardTheKiwi

回答

0

我使用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甚至不看的權利。

+0

你能告訴我如何在內部連接的幫助下做到這一點。 – user1599392

+0

顯示功能碼;編輯問題 – RichardTheKiwi

+0

SELECT A.EmpID,D.Name \t FROM empdetail一個INNER JOIN上A.empID = D.ID \t empdiv d其中EXISTS(SELECT * FROM X) – user1599392