[英]Using Table valued Function in join
有一个表值函数,该函数给出多行作为输出,有2列作为输出。
现在,我想在查询中使用此函数为employees表中的所有employee
我正在使用CROSS APPLY,但是它花费了很长时间,并且没有得到任何结果。
这是我尝试过的查询
select *
from emp A Cross APPLY fnempDiv(A.EmpID)
我正在使用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
或是发生故障,整个查询或成为哑弹的条件,只需通过在创纪录的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
甚至看起来都不正确。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.