2016-09-22 13 views
3

私はこれらの2つのテーブル(本当で数百万行)のようなものがあります:私はこのようなGridViewの中でそれらを表示するために別のテーブルitemsに1行に1つのテーブルdetailsのいくつかの行を集約する必要が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 | 
------------- 

を:

| 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のクエリで関数の結果を結合しようとしていますが、結合基準は上記の例のX列です。私はテーブルの機能dbo.ufnGetContactInformation(@PersonID INT)BusinessEntityID[Person].[EmailAddress]テーブルに参加するために含まれていAdventureWorks2012データベース、と最小限の例を作った:

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

2行は、私が実際に実行しようとするもの、を示しているが、場合にはコメントしないコメント接合プロセス中にe.[BusinessEntityID]に値がまだ存在しないことを、私は理解して

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

:、彼らは私が得る実際のエラーを非表示にします。だから私は、関数のパラメータを使用して、関数の特定のサブセットを選択することはできません、これは結合基準にとにかくする必要があります。さらに、関数はすべて行を返したり、テンポラリテーブルを作成したりすることはできません。なぜなら、これは私の特定の状況では時間と空間の両方に関して非常に遅くて高価なものですからです。

2つの既存のテーブルとテーブル関数でこれを実現する別の方法はありますか?使用してクロスを適用

を適用

答えて

2

アウターが適用され、内部結合に似て

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

おかげに参加左に似ています!これはまさに私が探していたものでした。 –

関連する問題