Как получить данные главной и подчиненной таблиц в одну строку с помощью SQL Server? - PullRequest
1 голос
/ 19 апреля 2010

У меня есть основная таблица с именем «Employee» и другая подчиненная таблица с именем «EmployeeTypes», которая имеет FK из «Employee».

Каждая строка в «Employee» может иметь ноль или несколько строк в «EmployeeTypes»и я хочу сделать SQL-запрос, который возвращает данные всех сотрудников, и каждая строка сотрудника должна содержать связанные данные в «EmployeeTypes» (например, столбец с именем «TypeID») в виде списка, разделенного запятыми, например:

Meco Beco ---    45   ---- 1,2,3

Ответы [ 3 ]

1 голос
/ 19 апреля 2010
    SELECT DISTINCT Name, e2.EmployeeID,ISNULL((SELECT STUFF((SELECT ',' + CAST(EmployeeType AS VARCHAR(20)) 
                    FROM Employee e
                    JOIN EmployeeType et ON (e.EmployeeID = et.EmployeeID)
                    WHERE e.EmployeeID = e2.EmployeeID
                    ORDER BY et.EmployeeType
                    FOR XML PATH('')),1,1,'')),'n/a') [EmployeeTypes]
    FROM Employee e2
    LEFT JOIN EmployeeType et2 ON (e2.EmployeeID = et2.EmployeeID)
0 голосов
/ 19 апреля 2010

Возможно, вам понадобится создать временную таблицу, чтобы "сгладить" отношения подчиненного и подчиненного, а затем динамически создать запрос на основе полей в этой временной таблице.

См. более ранние вопросы и ответы для получения более подробной информации.

0 голосов
/ 19 апреля 2010

Вы можете сделать это, комбинируя UDF, который использует метод Coalese для генерации списка CSV, с вашим стандартным оператором sql.

udf будет выглядеть примерно так:

create function ConcatEmployeeTypes(@employeeid int)
returns varchar(max)
as
begin

declare @result varchar(max)

select @result = coalesce(@result + ', ', '') + employeeType
from employeeTypes
where employeeId = @employeeid

return @result

end

Затем вы можете просто назвать udf следующим образом:

select employeename, dbo.ConcatEmployeeTypes(employeeid)
from Employees
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...