如何在一行输出

时间:2016-08-01 20:25:28

标签: sql oracle select wm-concat

我有这个问题:

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:role_code / user_code

我试图实现这样的查询:

SELECT table_2.roles_code, wm_concat(table_2.apps_code) AS apps 
FROM   table_2
GROUP BY table_2.roles_code;

1 个答案:

答案 0 :(得分: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;