【问题标题】:How to get Master and Slave Table data in one row using SQL Server?如何使用 SQL Server 在一行中获取主从表数据?
【发布时间】:2010-04-19 06:12:49
【问题描述】:

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

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

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

【问题讨论】:

  • 您需要使用 OUTER JOIN;您还需要使用与 MySQL 和其他 DBMS 中的 GROUP_CONCAT 函数等效的东西。

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


【解决方案1】:
SELECT DISTINCT Name, e2.EmployeeID,ISNULL((SELECT STUFF((SELECT ',' + CAST(EmployeeType AS VARCHAR(20)) 来自员工 e JOIN EmployeeType et ON (e.EmployeeID = et.EmployeeID) 其中 e.EmployeeID = e2.EmployeeID ORDER BY et.EmployeeType FOR XML PATH('')),1,1,'')),'n/a') [EmployeeTypes] 来自员工 e2 LEFT JOIN EmployeeType et2 ON (e2.EmployeeID = et2.EmployeeID)

【讨论】:

    【解决方案2】:

    您可以通过将使用 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
    

    【讨论】:

    • 感谢您提供此解决方案,但是否有任何其他解决方案可以在不使用函数的情况下在一个查询中完成?
    • @Space Cracker - 不,我不相信有这样的解决方案。据我所知,您唯一的选择是临时表或 udf。我可能值得看一下 pivot 命令...我认为它不是你想要的,但我从来没有在愤怒中使用它,所以它可能对你有用。
    • @David,我已经在下面的stackoverflow.com/questions/451415/… 中找到了我要搜索的内容,但我不知道哪个性能最好,您的解决方案还是上述 URL 中的那个?
    • @Space Cracker group_concat 不是 sql server 函数。据我所知,模拟它的唯一方法是使用类似我的解决方案。
    • @Space Cracker - 抱歉,第一次没有正确阅读该链接。我不确定哪个答案会提供最佳性能。最好的确定方法是自己测试性能。只是要小心测试有代表性的数据大小,这可能会影响事情。
    【解决方案3】:

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

    查看earlier question and answers了解更多详情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-07-30
      • 1970-01-01
      • 1970-01-01
      • 2010-11-13
      • 2014-05-04
      • 1970-01-01
      • 2020-02-05
      相关资源
      最近更新 更多