Sql server 为什么可以';从表值函数返回的表是否有一个联接?

Sql server 为什么可以';从表值函数返回的表是否有一个联接?,sql-server,Sql Server,与表值函数(TVF)的内部联接等效的是使用交叉应用(一个内部联接与TVF) 我想知道为什么SQLServer不允许使用TVF的返回值进行连接。具体来说,在TVF上执行交叉应用与使用临时表进行内部连接有何不同?SQL Server定义TVF和临时表的返回表的方式是否有差异 在TVF上进行交叉应用与使用 临时桌子 您可以加入TVF,但是您不能在TVF调用中使用加入表中的列: DECLARE @directions VARCHAR(MAX) = 'N, S, W, E' SELECT a.Str

与表值函数(TVF)的内部联接等效的是使用
交叉应用
(一个内部联接与TVF)

我想知道为什么SQLServer不允许使用TVF的返回值进行连接。具体来说,在TVF上执行
交叉应用
与使用临时表进行内部连接有何不同?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
这里,表值函数基于由标记分隔的字符串列表创建一个表。这个查询不会有问题,因为table函数的结果是已知的,并且不会随着连接表的结果而改变。它运行一次,生成的表被连接到
地址

当TVF与联接表中的列一起使用时,必须使用
交叉应用
,而不是
联接

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

此处,地理位置是根据我们在计算时使用的表计算的,并且该函数需要在
地址
表的每行调用一次。

考虑以下因素:

SELECT *
FROM tblFoo
INNER JOIN (fnGetTable(tblFoo.someValue)
fgettable
tblFoo.someValue
的每个值返回一个新表。因此,与其加入一个表,不如加入多个表


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

通过内部联接,两个表在整个过程中都是稳定的。使用
apply
时,右侧表格表达式的内容可以针对左侧的每一行进行更改。如果我们有一个简短的代码示例,说明您正在尝试执行的操作,我们可以编写一个更好的答案。@MartinSmith这个答案很有意义。