1

有一个表值函数,它提供多行作为输出,并且有 2 列作为输出。

现在我想在查询employees表中的所有员工时使用这个函数

我正在使用 CROSS APPLY 但它需要很长时间并且没有给出任何结果。

这是我尝试过的查询

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

1 回答 1

0

我正在使用交叉应用

  • 它需要很长时间

不幸的是,这就是 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甚至看起来都不正确。

于 2012-10-11T18:54:57.327 回答