[英]Why can't one join with a table returned from a table valued function?
具有表值函數(TVF)的內部聯接的等效項是使用CROSS APPLY
(一個不能與TVF進行內部聯接)。
我想知道為什么SQL Server不允許使用TVF的返回值進行聯接。 具體來說,在TVF上執行CROSS APPLY
與使用臨時表進行內部聯接有何不同? 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
在此,表值函數基於由令牌分隔的字符串列表創建表。 該查詢不會有問題,因為表函數的結果是已知的,並且不會因連接表的結果而改變。 它運行一次,結果表將連接到Address
。
當TVF與連接表中的列一起使用時,必須使用cross apply
而不是join
。
SELECT a.ZIP, g.Long, g.Lat
FROM dbo.Address a
CROSS APPLY dbo.GeoLocation(a.ZIP) g
這里的地理位置是根據我們在計算時使用的表進行計算的,該功能需要在Address
表的每一行調用一次。
考慮以下:
SELECT *
FROM tblFoo
INNER JOIN (fnGetTable(tblFoo.someValue)
fnGetTable
為tblFoo.someValue
每個值返回一個新表。 因此,不是與一個表聯接,而是與許多表聯接。
我認為最終這與臨時表和db表是常量對象有關。 表值函數不一定每次都返回相同的表對象。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.