如何使用 SQL 查询创建逗号分隔的列表?
我有 3 个表,名为:
- 应用程序(id,名称)
- 资源(id,名称)
- 应用程序资源(id,app_id,resource_id)
我想在 GUI 上显示所有资源名称的表。在每一行的一个单元格中,我想列出该资源的所有应用程序(以逗号分隔)。
所以问题是,在 SQL 中执行此操作的最佳方法是什么,因为我需要获取所有资源,并且还需要获取每个资源的所有应用程序?
我是否首先运行 select * from resources,然后循环遍历每个资源并对每个资源执行单独的查询以获取该资源的应用程序列表?
有没有一种方法可以在一个查询中完成此操作?
I have 3 tables called:
- Applications (id, name)
- Resources (id, name)
- ApplicationsResources (id, app_id, resource_id)
I want to show on a GUI a table of all resource names. In one cell in each row I would like to list out all of the applications (comma separated) of that resource.
So the question is, what is the best way to do this in SQL as I need to get all resources and I also need to get all applications for each resource?
Do I run a select * from resources first and then loop through each resource and do a separate query per resource to get the list of applications for that resource?
Is there a way I can do this in one query?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(11)
假设 SQL Server:
表结构:
查询:
结果:
Assuming SQL Server:
Table structure:
Query:
Results:
我认为我们可以通过下面的方式来编写来检索(下面的代码只是一个示例,请根据需要进行修改):
I think we could write in the following way to retrieve(below code is just an example, please modify as needed):
从下一个版本的 SQL Server 开始,您将能够执行
以下操作:该产品的不同版本有多种不同的方法来解决这个问题。文章中对它们进行了精彩的回顾: 在 Transact-SQL 中连接行值。
当项目数量未知时连接值
.
不可靠的方法
From next version of SQL Server you will be able to do
For previous versions of the product there are quite a wide variety of different approaches to this problem. An excellent review of them is in the article: Concatenating Row Values in Transact-SQL.
Concatenating values when the number of items are not known
.
Non-reliable approaches
没有办法以与数据库无关的方式来做到这一点。
因此,您需要像这样获取整个数据集:
然后以编程方式连接AppName,同时按ResName分组。
There is no way to do it in a DB-agnostic way.
So you need to get the whole data-set like this:
And then concat the AppName programmatically while grouping by ResName.
MySQL
**
MS SQL Server
Oracle
MySQL
**
MS SQL Server
Oracle
保持不可知论,退后并押注。
现在使用您的服务器编程语言连接 a_names,而 r_name 与上次相同。
To be agnostic, drop back and punt.
Now user your server programming language to concatenate a_names while r_name is the same as the last time.
这将在 SQL Server 中完成:
This will do it in SQL Server:
MySQL
SQL Server (2005+)
SQL Server (2017+)
Oracle
我建议阅读有关字符串的内容Oracle 中的聚合/串联。
MySQL
SQL Server (2005+)
SQL Server (2017+)
Oracle
I recommend reading about string aggregation/concatentation in Oracle.
使用 COALESCE 在 SQL Server 中构建逗号分隔字符串
http://www.sqlteam.com/article/ using-coalesce-to-build-comma-delimited-string
示例:
Using COALESCE to Build Comma-Delimited String in SQL Server
http://www.sqlteam.com/article/using-coalesce-to-build-comma-delimited-string
Example:
我不知道是否有任何解决方案可以以与数据库无关的方式执行此操作,因为您很可能需要某种形式的字符串操作,而供应商之间的操作通常有所不同。
对于 SQL Server 2005 及更高版本,您可以使用:
它使用 SQL Server 2005
FOR XML PATH
构造将子项(给定资源的应用程序)列为逗号分隔列表。马克
I don't know if there's any solution to do this in a database-agnostic way, since you most likely will need some form of string manipulation, and those are typically different between vendors.
For SQL Server 2005 and up, you could use:
It uses the SQL Server 2005
FOR XML PATH
construct to list the subitems (the applications for a given resource) as a comma-separated list.Marc
我相信你想要的是:
SELECT ItemName, GROUP_CONCAT(DepartmentId) FROM table_name GROUP BY ItemName
如果你使用 MySQL
Reference
I believe what you want is:
SELECT ItemName, GROUP_CONCAT(DepartmentId) FROM table_name GROUP BY ItemName
If you're using MySQL
Reference