2012-10-11 40 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