如何在一行输出中显示多行值
Posted
技术标签:
【中文标题】如何在一行输出中显示多行值【英文标题】:How to displaying multiple rows values in a one line of output 【发布时间】:2016-08-01 20:25:28 【问题描述】:我有这个疑问:
SELECT table_1.user_code AS user,
table_1.charge_code,
table_1.unit_code,
table_3.roles_code,
table_2.apps_code
FROM table_1
INNER JOIN table_3 ON
table_1.user_code = table_3.Cod_Usr
INNER JOIN table_2 ON
table_3.roles_code = table_2.roles_code
WHERE
table_1.fec_baja IS NULL
ORDER BY table_1.user_code ASC, table_3.roles_code, table_2.roles_code;
我通常用它来根据用户的charge_code、unit_code和role_code来了解用户可以访问的applications_code
而且,这是上面查询的结果:
user_code charge_code unit_code role_code apps_code
1 USER01 AAA001 111111111 BASICMENU APPS0001
2 USER01 AAA001 111111111 BASICMENU APPS0005
3 USER01 AAA001 111111111 BASICMENU APPS0008
4 USER01 AAA001 111111111 BASICMENU APPS1245
5 USER01 AAA001 111111111 LOGIN APPS0013
6 USER01 AAA001 111111111 LOGIN APPS1291
7 USER02 BBB0001 222222222 CASHIER001 APPS01SF
8 USER02 BBB0001 222222222 CASHIER001 APPS12RE
9 USER02 BBB0001 222222222 CASHIER001 APPS178E
8 USER02 BBB0001 222222222 CASHIER001 APPSZS45
9 USER02 BBB0001 222222222 CASHIER001 APPS12DF
10 USER02 BBB0001 222222222 CASHIER001 APPS1RE5
11 USER02 BBB0001 222222222 BASICMENU APPSTY45
12 USER02 BBB0001 222222222 BASICMENU APPS1KJ5
以前我可以完美运行,但现在由于大量记录需要运行 10 多分钟。
我正在尝试得到以下结果:
user_code charge_code unit_code role_code apps_code
1 USER01 AAA001 111111111 BASICMENU APPS0001,APPS0005,APPS0008,APPS1245
2 USER01 AAA001 111111111 LOGIN APPS0013,APPS1291
3 USER02 BBB0001 222222222 CASHIER001 APPS01SF,APPS12RE,APPSZS45,APPS178E,APPS12DF,APPS1RE5
4 USER02 BBB0001 222222222 BASICMENU APPSTY45,APPS1KJ5
注意:这些是显示每个表的记录。
table_1:user_code/charge_code/unit_code table_2:role_code / apps_code table_3:角色代码/用户代码我正在尝试实现这样的查询:
SELECT table_2.roles_code, wm_concat(table_2.apps_code) AS apps
FROM table_2
GROUP BY table_2.roles_code;
【问题讨论】:
为什么要以聚合(逗号分隔)格式输出?也许有更有效的方法来做你最终需要做的事情。 输出格式并不重要...我只需要一行中的所有值。 @mathguy 你能推荐我一个更有效的方法吗? @mathguy 这取决于您希望(需要)如何使用输出。假设您能够按照最初的要求进行聚合 - 那么您将其用于什么目的,或者您如何使用它?在许多情况下,它成为进一步处理的输入,是这样吗?还是您这样做是为了显示/报告目的? 哦,我明白了,listagg 不适合你......无论如何,如果你的原始查询(以前可以正常工作)现在需要很长时间,那么一个新的使用 listagg 将花费更长的时间,如果您必须在 Oracle 10 中“手动”执行 listagg,则需要更长的时间。您是否认为这是提高性能的一种方式?这无济于事。你考虑过物化视图吗? 【参考方案1】:你可以使用 LISTAGG
SELECT
table_2.roles_code,
LISTAGG(table_2.apps_code, ', ') WITHIN GROUP (ORDER BY table_2.apps_code) "apps code"
FROM table_2
GROUP BY able_2.roles_code
为了您的查询
SELECT table_1.user_code AS user,
table_1.charge_code,
table_1.unit_code,
table_3.roles_code,
table_2.roles_code,
LISTAGG(table_2.apps_code, ', ') WITHIN GROUP (ORDER BY table_2.apps_code) "apps code"
FROM table_1
INNER JOIN table_3 ON
table_1.user_code = table_3.Cod_Usr
INNER JOIN table_2 ON
table_3.roles_code = table_2.roles_code
WHERE
table_1.fec_baja IS NULL
GROUP BY table_1.user_code ASC, table_3.roles_code, table_2.roles_code
ORDER BY table_1.user_code ASC, table_3.roles_code, table_2.roles_code;
与 wm_concat() 应该是
SELECT table_1.user_code AS user,
table_1.charge_code,
table_1.unit_code,
table_3.roles_code,
table_2.roles_code,
wm_concat(table_2.apps_code) "apps code"
FROM table_1
INNER JOIN table_3 ON
table_1.user_code = table_3.Cod_Usr
INNER JOIN table_2 ON
table_3.roles_code = table_2.roles_code
WHERE
table_1.fec_baja IS NULL
GROUP BY table_1.user_code ASC, table_3.roles_code, table_2.roles_code
ORDER BY table_1.user_code ASC, table_3.roles_code, table_2.roles_code;
【讨论】:
但我如何才能加入第一个查询? @scaisEdge 我用这种方式尝试了很多次,但我得到了这个错误:ORA-00923:在预期的地方找不到 FROM 关键字。我检查了语法,找不到任何错误。 @scaisEdge 我有这个版本的 oracle:Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - 64bi。我认为 listagg 适用于 11.2 或更高版本。 @scaisEdge 您知道与 wm_concat 函数集成的方法吗? @scaisEdge以上是关于如何在一行输出中显示多行值的主要内容,如果未能解决你的问题,请参考以下文章
如何组合多行数据,直到下一行值在 SQL Server 中不为空