具有表值函数(TVF)的内连接的等价物是使用CROSS APPLY
(一个cannot内连接与TVF)。
我想知道为什么SQL Server不允许使用TVF的返回值进行连接。具体来说,如何在TVF上进行CROSS APPLY
而不是使用临时表进行内部连接? SQL Server如何定义TVF和临时表的返回表有什么不同?
答案 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表是常量对象有关。表值函数不必每次都返回相同的表对象。