2016-09-22 41 views
3

我有(按實際價值不過幾百萬行)像這2個表:如何在MS SQL Server中使用表函數結果?

items: 
| X | Y | 
--------- 
| 1 | 2 | 
| 3 | 4 | 
--------- 

details: 
| X | A | B | 
------------- 
| 1 | a | b | 
| 1 | c | d | 
| 3 | e | f | 
| 3 | g | h | 
------------- 

我要聚集一個表details的幾行一行在另一個表items顯示他們在這樣一個GridView :

| items.X | items.Y | details.A | details.B | 
--------------------------------------------- 
| 1  | 2  | a, c  | b, d  | 
| 3  | 4  | e, g  | f, h  | 
--------------------------------------------- 

我已經讀過this和相關的問題,我知道GROUP_CONCAT,但我不允許客戶系統上安裝它。因爲我沒有機會在本地執行此操作,所以我創建了一個存儲函數(我可以創建該函數),該函數返回一個表,其中列X,AB。此功能迄今爲止工作正常,但我似乎沒有將這些列添加到我的結果集。

目前我試圖加入items查詢的函數結果,在上面的示例中,join-criterion將是X-列。我做了一個小例子,與AdventureWorks2012數據庫,其中包含一個表函數dbo.ufnGetContactInformation(@PersonID INT)[Person].[EmailAddress]臺加入關於BusinessEntityID

SELECT 
    [EmailAddress] 
    -- , p.[FirstName] 
    -- , p.[LastName] 
FROM 
    [Person].[EmailAddress] e 
INNER JOIN 
    dbo.ufnGetContactInformation(e.[BusinessEntityID]) p 
    ON p.[PersonID] = e.[BusinessEntityID] 

的2註釋行表示,我嘗試在現實中的事,但如果沒有評論,他們隱藏了實際的錯誤,我得到:

Event 4104, Level 16, Status 1, Line 6 
The multi-part identifier 'e.BusinessEntityID' could not be bound. 

我明白,在接合過程中存在的e.[BusinessEntityID]沒有價值呢。所以我不能通過使用函數參數來選擇函數中的特定子集,無論如何這應該在連接標準中。此外,我不能讓該函數返回全部行或創建一個臨時表,因爲在我的特定情況下,這對於時間和空間來說都是非常慢和昂貴的。

是否有另一種方式來實現這樣的事情,2現有的表和表函數?

回答

2

使用應用

跨應用類似於內部連接,外部應用類似於左加入

SELECT 
    [EmailAddress] 
    -- , p.[FirstName] 
    -- , p.[LastName] 
FROM 
    [Person].[EmailAddress] e 
cross apply 
    dbo.ufnGetContactInformation(e.[BusinessEntityID]) p 
+0

謝謝!這正是我正在尋找的。 –

相關問題