2016-06-13 15 views
2

与表值函数(TVF)的内部联接的等价物是使用CROSS APPLY(一个cannot与TVF的内部联接)。为什么不能用从表值函数返回的表连接?

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

+1

通过内部连接,两个表在整个过程中都很稳定。使用'apply'时,右侧表格表达式的内容可以在左侧的每一行中改变。 –

+0

如果我们有一个你想要做的事情的短代码样本,我们可以写一个更好的答案。 –

+0

@MartinSmith这个答案很有意义。 – rookie

回答

0

考虑以下几点:

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

fnGetTable返回一个新表tblFoo.someValue每个值。所以不要加入一张桌子,而是加入很多人。

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

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 

这里的广告位置是基于我们使用在计算时表计算,并且功能需要每Address表行一旦被调用。

相关问题