为什么不能与表值函数返回的表连接?

时间:2016-06-13 17:59:44

标签: sql-server

具有表值函数(TVF)的内连接的等价物是使用CROSS APPLY(一个cannot内连接与TVF)。

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

2 个答案:

答案 0 :(得分:3)

  

如何在TVF上进行CROSS APPLY,而不是内部加入   临时表?

可以加入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

此处Geo Location是根据我们在计算时使用的表计算的,并且该函数需要在Address表的每一行调用一次。

答案 1 :(得分:0)

请考虑以下事项:

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

fnGetTable返回 {/ 1>}的每个值的新表格。因此,不是加入一张桌子,而是与许多人一起加入。

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