是否存在将多行聚合为一行的 Oracle SQL 查询?
我有一个如下所示的表:
A 1
A 2
B 1
B 2
我想生成一个如下所示的结果集:
A 1 2
B 1 2
是否有 SQL 语句可以执行此操作? 我正在使用甲骨文。
相关问题:
- 从单行返回多行我的问题与这个问题接近相反。
- 使用 LINQ 进行连接 这是这正是我想要做的,但没有 LINQ。
I have a table that looks like this:
A 1
A 2
B 1
B 2
And I want to produce a result set that looks like this:
A 1 2
B 1 2
Is there a SQL statement that will do this? I am using Oracle.
Related questions:
- Returning multiple rows from a single row My question is close to the opposite of this question.
- Use LINQ to concatenate This is exactly what I want to do, but without LINQ.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
在
Oracle 10g+
中:请参阅我的博客中的这篇文章以获取说明:
GROUP_CONCAT
In
Oracle 10g+
:See this article in my blog for explanations:
GROUP_CONCAT
inOracle 10g
尝试类似的方法:
自由地受到在此 Oracle 论坛中找到的答案的启发。
编辑:事实证明,该解决方案非常资源密集型,请求涉及 105 行之类的内容。 我最终用自定义聚合函数替换了它,如 约翰建议。
Try something like :
Freely inspired by an answer found in this Oracle forum.
EDIT: this solution proved very resources intensive with requests involving something like 105 rows. I ended up replacing this by custom aggregate functions as suggested by John.
如果你有 10g,那么你必须执行以下功能:
因此,你可以这样做:
在这里摆弄
如果您有 Oracle 11g,则可以使用 listagg :
在这里查找 Listagg
If you have got 10g, then you have to go through the function below:
So, you can do like:
Fiddle here
If you have got oracle 11g, you can use listagg :
Fiddle here for Listagg
用户定义的聚合函数: http://www.adp-gmbh.ch/ora /sql/user_def_agg.html
只需复制/粘贴并使用它。 适用于 9i。
User defined aggregate functions: http://www.adp-gmbh.ch/ora/sql/user_def_agg.html
Just copy/paste and use it. Works on 9i.
在 pl/sql 中使用时非常有用 - 可以转换为用户定义的集合。
very useful when used in pl/sql - can be casted to a user defined collection.
(警告 -
WM_CONCAT
是一个不受支持的函数,已在版本 12c 中删除。除非您使用的是非常旧的数据库,否则应该避免使用此函数。您可能应该使用 < code>LISTAGG。)这取决于您使用的 Oracle 版本。 如果它支持 wm_concat() 函数,那么你可以简单地执行如下操作:
wm_concat() 基本上就像 group_concat()。 它可能没有被记录下来,所以启动 ye olde sqlplus 并查看它是否在那里。
如果它不在那里,那么您将需要自己实现等效的东西。 您可以在字符串聚合页面 在 oracle-base.com。
(WARNING -
WM_CONCAT
is an unsupported function that was removed in version 12c. Unless you're using a very old database, you should avoid this function. You should probably useLISTAGG
instead.)It depends on the version of Oracle you're using. If it supports the wm_concat() function, then you can simply do something like this:
wm_concat() basically works just like group_concat() in MySQL. It may not be documented, so fire up ye olde sqlplus and see if it's there.
If it isn't there, then you'll want to implement something equivalent yourself. You can find some instructions on how to do this in the string aggregation page at oracle-base.com.
相当老的话题,但它可以帮助其他人,因为 Oracle 同时改进了。
LISTAGG 函数就是您要寻找的(在至少11克)
Pretty old topic, but it could help others since Oracle improved in the mean time.
The LISTAGG function is what you are looking for (in 11g at least)