如何使用SQL查询创建逗号分隔列表?

leo*_*ora 53 sql t-sql sql-server string-aggregation

我有3个表叫:

  • 应用程序(id,name)
  • 资源(id,name)
  • ApplicationsResources(id,app_id,resource_id)

我想在GUI上显示所有资源名称的表.在每行的一个单元格中,我想列出该资源的所有应用程序(以逗号分隔).

所以问题是,在SQL中执行此操作的最佳方法是什么,因为我需要获取所有资源,而且还需要获取每个资源的所有应用程序?

我是否首先从资源运行select*然后遍历每个资源并对每个资源执行单独的查询以获取该资源的应用程序列表?

有没有办法在一个查询中执行此操作?

OMG*_*ies 116

MySQL的

  SELECT r.name,
         GROUP_CONCAT(a.name SEPARATOR ',')
    FROM RESOURCES r
    JOIN APPLICATIONSRESOURCES ar ON ar.resource_id = r.id
    JOIN APPLICATIONS a ON a.id = ar.app_id
GROUP BY r.name
Run Code Online (Sandbox Code Playgroud)

SQL Server(2005+)

SELECT r.name,
       STUFF((SELECT ','+ a.name
               FROM APPLICATIONS a
               JOIN APPLICATIONRESOURCES ar ON ar.app_id = a.id
              WHERE ar.resource_id = r.id
           GROUP BY a.name
            FOR XML PATH(''), TYPE).value('.','VARCHAR(max)'), 1, 1, '')
 FROM RESOURCES r
Run Code Online (Sandbox Code Playgroud)

SQL Server(2017+)

  SELECT r.name,
         STRING_AGG(a.name, ',')
    FROM RESOURCES r
    JOIN APPLICATIONSRESOURCES ar ON ar.resource_id = r.id
    JOIN APPLICATIONS a ON a.id = ar.app_id
GROUP BY r.name
Run Code Online (Sandbox Code Playgroud)

神谕

我建议在Oracle中阅读有关字符串聚合/连接的内容.

  • SQL Server无缘无故地变得困难 (8认同)

Rob*_*vey 27

使用COALESCE在SQL Server中构建逗号分隔的字符串
http://www.sqlteam.com/article/using-coalesce-to-build-comma-delimited-string

例:

DECLARE @EmployeeList varchar(100)

SELECT @EmployeeList = COALESCE(@EmployeeList + ', ', '') + 
   CAST(Emp_UniqueID AS varchar(5))
FROM SalesCallsEmployees
WHERE SalCal_UniqueID = 1

SELECT @EmployeeList
Run Code Online (Sandbox Code Playgroud)

  • 这似乎是一个比评价更高的答案更好的解决方案.简单而多功能. (3认同)

mar*_*c_s 11

我不知道是否有任何解决方案以数据库无关的方式执行此操作,因为您很可能需要某种形式的字符串操作,并且这些通常在供应商之间是不同的.

对于SQL Server 2005及更高版本,您可以使用:

SELECT
     r.ID, r.Name,
     Resources = STUFF(
       (SELECT ','+a.Name
        FROM dbo.Applications a
        INNER JOIN dbo.ApplicationsResources ar ON ar.app_id = a.id
        WHERE ar.resource_id = r.id
        FOR XML PATH('')), 1, 1, '')
FROM
     dbo.Resources r
Run Code Online (Sandbox Code Playgroud)

它使用SQL Server 2005 FOR XML PATH构造将子项(给定资源的应用程序)列为逗号分隔列表.


Jam*_*ong 5

我相信你想要的是:

SELECT ItemName, GROUP_CONCAT(DepartmentId) FROM table_name GROUP BY ItemName

如果您正在使用MySQL

参考


Ken*_*eth 5

假设SQL Server:

表结构:

CREATE TABLE [dbo].[item_dept](
    [ItemName] char(20) NULL,
    [DepartmentID] int NULL   
)
Run Code Online (Sandbox Code Playgroud)

查询:

SELECT ItemName,
       STUFF((SELECT ',' + rtrim(convert(char(10),DepartmentID))
        FROM   item_dept b
        WHERE  a.ItemName = b.ItemName
        FOR XML PATH('')),1,1,'') DepartmentID
FROM   item_dept a
GROUP BY ItemName
Run Code Online (Sandbox Code Playgroud)

结果:

ItemName    DepartmentID
item1       21,13,9,36
item2       4,9,44
Run Code Online (Sandbox Code Playgroud)


Dmy*_*iak 2

没有办法以与数据库无关的方式来做到这一点。所以你需要像这样获取整个数据集:

select 
  r.name as ResName, 
  a.name as AppName
from 
  Resouces as r, 
  Applications as a, 
  ApplicationsResources as ar
where
  ar.app_id = a.id 
  and ar.resource_id = r.id
Run Code Online (Sandbox Code Playgroud)

然后以编程方式连接AppName ,同时按 ResName分组。