在连接中使用表值函数

时间:2012-10-11 18:37:06

标签: sql sql-server sql-server-2008 sql-server-2005 cross-apply

有一个Table值函数,它给出了多行作为输出,有2列作为输出。

现在我想在查询中使用此功能,以便员工表中的所有员工

我正在使用CROSS APPLY但它需要很长时间而且不会给出任何结果。

这是我试过的查询

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

1 个答案:

答案 0 :(得分:0)

我正在使用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要么失败整个查询,要么成为dud条件,只需在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甚至看起来都不正确。