与表值函数(TVF)的内部联接的等价物是使用CROSS APPLY
(一个cannot与TVF的内部联接)。为什么不能用从表值函数返回的表连接?
我想知道为什么SQL Server不允许使用TVF的返回值连接。具体来说,TVF上的CROSS APPLY
如何与内部加入临时表不同? SQL Server如何定义TVF和临时表的返回表有什么区别?
与表值函数(TVF)的内部联接的等价物是使用CROSS APPLY
(一个cannot与TVF的内部联接)。为什么不能用从表值函数返回的表连接?
我想知道为什么SQL Server不允许使用TVF的返回值连接。具体来说,TVF上的CROSS APPLY
如何与内部加入临时表不同? SQL Server如何定义TVF和临时表的返回表有什么区别?
考虑以下几点:
SELECT *
FROM tblFoo
INNER JOIN (fnGetTable(tblFoo.someValue)
fnGetTable
返回一个新表的tblFoo.someValue
每个值。所以不要加入一张桌子,而是加入很多人。
我认为最终这与临时表和db表是常量对象有关。表值函数不一定每次都返回相同的表对象。
如何做一个不同于内部加入 一个临时表的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
这里的广告位置是基于我们使用在计算时表计算,并且功能需要每Address
表行一旦被调用。
通过内部连接,两个表在整个过程中都很稳定。使用'apply'时,右侧表格表达式的内容可以在左侧的每一行中改变。 –
如果我们有一个你想要做的事情的短代码样本,我们可以写一个更好的答案。 –
@MartinSmith这个答案很有意义。 – rookie