leo*_*ora 53 sql t-sql sql-server string-aggregation
我有3个表叫:
我想在GUI上显示所有资源名称的表.在每行的一个单元格中,我想列出该资源的所有应用程序(以逗号分隔).
所以问题是,在SQL中执行此操作的最佳方法是什么,因为我需要获取所有资源,而且还需要获取每个资源的所有应用程序?
我是否首先从资源运行select*然后遍历每个资源并对每个资源执行单独的查询以获取该资源的应用程序列表?
有没有办法在一个查询中执行此操作?
OMG*_*ies 116
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)
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)
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)
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)
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
构造将子项(给定资源的应用程序)列为逗号分隔列表.
渣
我相信你想要的是:
SELECT ItemName, GROUP_CONCAT(DepartmentId) FROM table_name GROUP BY ItemName
如果您正在使用MySQL
参考
假设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)
没有办法以与数据库无关的方式来做到这一点。所以你需要像这样获取整个数据集:
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分组。