簡體   English   中英

為什么一個人不能與從表值函數返回的表聯接?

[英]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)

fnGetTabletblFoo.someValue 每個值返回一個新表。 因此,不是與一個表聯接,而是與許多表聯接。

我認為最終這與臨時表和db表是常量對象有關。 表值函數不一定每次都返回相同的表對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM