如何在一行输出中显示多行值

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 中不为空

如何在一个表中显示多行,另一表中的一行显示为单行

Laravel:如何在视图刀片中的一行中显示来自 DB 的多行

如何将多行输出连接到一行?

关于Oracle,在一行中个别字段多行显示。

如何使 UIAlertView 上的按钮多行显示?