有一个表值函数,它提供多行作为输出,并且有 2 列作为输出。
现在我想在查询employees表中的所有员工时使用这个函数
我正在使用 CROSS APPLY 但它需要很长时间并且没有给出任何结果。
这是我尝试过的查询
select *
from emp A Cross APPLY fnempDiv(A.EmpID)
有一个表值函数,它提供多行作为输出,并且有 2 列作为输出。
现在我想在查询employees表中的所有员工时使用这个函数
我正在使用 CROSS APPLY 但它需要很长时间并且没有给出任何结果。
这是我尝试过的查询
select *
from emp A Cross APPLY fnempDiv(A.EmpID)
我正在使用交叉应用
不幸的是,这就是 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
甚至看起来都不正确。