有一个Table值函数,它给出了多行作为输出,有2列作为输出。
现在我想在查询中使用此功能,以便员工表中的所有员工
我正在使用CROSS APPLY但它需要很长时间而且不会给出任何结果。
这是我试过的查询
select *
from emp A Cross APPLY fnempDiv(A.EmpID)
答案 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
甚至看起来都不正确。