繁体   English   中英

为什么一个人不能与从表值函数返回的表联接?

[英]Why can't one join with a table returned from a table valued function?

具有表值函数(TVF)的内部联接的等效项是使用CROSS APPLY (一个不能与TVF进行内部联接)。

我想知道为什么SQL Server不允许使用TVF的返回值进行联接。 具体来说,在TVF上执行CROSS APPLY与使用临时表进行内部联接有何不同? SQL Server定义TVF的返回表和临时表的方式是否有所不同?

在TVF上执行交叉申请与使用临时表进行内部联接有何不同?

可以加入TVF,但是不能在TVF调用中使用加入表中的列:

DECLARE @directions VARCHAR(MAX) = 'N, S, W, E' 

SELECT  a.StreetName, s.Value
FROM dbo.Address a 
JOIN dbo.SplitByToken(@directions, ',') s ON a.Direction = s.Value

在此,表值函数基于由令牌分隔的字符串列表创建表。 该查询不会有问题,因为表函数的结果是已知的,并且不会因连接表的结果而改变。 它运行一次,结果表将连接到Address

当TVF与连接表中的列一起使用时,必须使用cross apply而不是join

SELECT  a.ZIP, g.Long, g.Lat
FROM dbo.Address a 
CROSS APPLY dbo.GeoLocation(a.ZIP) g

这里的地理位置是根据我们在计算时使用的表进行计算的,该功能需要在Address表的每一行调用一次。

考虑以下:

SELECT *
FROM tblFoo
INNER JOIN (fnGetTable(tblFoo.someValue)

fnGetTabletblFoo.someValue 每个值返回一个新表。 因此,不是与一个表联接,而是与许多表联接。

我认为最终这与临时表和db表是常量对象有关。 表值函数不一定每次都返回相同的表对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM