Oracle LISTAGG函数实现属性表多行权限值合并为单行列表
优化Oracle属性表的聚合查询方案
嘿,我来帮你把这个查询变得更简洁优雅!你的需求是把属性表中同一个用户的permission值聚合为列表,同时替换显示真实的user_id(也就是attr_name='user_id'对应的attr_value),其实不用嵌套子查询自连接,一次聚合就能搞定。
更简洁的实现代码
SELECT -- 提取当前用户对应的真实user_id值(每个user_id只会有一条user_id属性记录) MAX(CASE WHEN attr_name = 'user_id' THEN attr_value END) AS user_id, -- 聚合permission属性值为逗号分隔的列表 LISTAGG(CASE WHEN attr_name = 'permission' THEN attr_value END, ', ') WITHIN GROUP (ORDER BY attr_value) AS permission_list FROM foo -- 如果只需要单个用户的数据就保留WHERE,要所有用户就去掉并加上GROUP BY user_id WHERE user_id = 'joe' GROUP BY user_id;
为什么这个方案更好?
- 更少的表扫描:原写法用了自连接子查询,相当于至少扫描表两次;这个方案只需要一次全表扫描(或单用户的索引扫描),执行效率更高。
- 代码更紧凑:去掉了嵌套子查询的层级,逻辑一目了然,维护起来更方便。
- 扩展性强:如果需要处理所有用户的数据,只需要去掉
WHERE user_id = 'joe',保留GROUP BY user_id即可,自动为每个用户生成对应的权限列表。
测试结果
用你给出的测试数据执行这个查询,会直接得到你想要的结果:
user_id permission_List
abc123 A, B, C
内容的提问来源于stack exchange,提问作者Micho Rizo
相关产品推荐
相关产品推荐

