如何使用SQL Server将Master和Slave Table数据放在一行?

时间:2010-04-19 06:12:49

标签: sql sql-server sql-server-2005

我有一个名为'Employee'的主表和另一个名为'EmployeeTypes'的从属表,它有一个来自'Employee'的FK。

'Employee'中的每一行在'EmployeeTypes'中可以有零行或多行,我想创建一个返回所有Employees数据的SQL Query,每个雇员行应在'EmployeeTypes'中包含其相关数据(例如列)称为“TypeID”)为逗号分隔列表,如下所示:

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

3 个答案:

答案 0 :(得分:1)

    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)

答案 1 :(得分:0)

您可以通过将使用Coalese生成CSV列表方法的UDF与标准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

答案 2 :(得分:0)

您可能需要创建一个临时表来“展平”主从关系,然后根据此临时表中的字段动态创建查询。

有关详细信息,请参阅此earlier question and answers