2016-09-22 3 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, A и B. До сих пор эта функция отлично работает, но мне кажется, что эти столбцы не добавлены в мой результирующий набор.

В настоящее время я пытаюсь присоединиться к результату функции с запросом на items, критерием соединения будет X-column в приведенном выше примере. Я сделал минимальный пример с базой данных 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

Применение Нанести

Крест применить подобен внутреннему соединению, Outer применять схожа налево присоединиться

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

Спасибо! Это именно то, что я искал. –

Смежные вопросы