2016-08-01 60 views
0

的单行显示多行的值我有这个疑问:如何输出

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; 
+0

你为什么要在汇总(逗号分隔)格式输出?也许有更有效的方法来做你最终需要做的事情。 – mathguy

+0

输出格式不重要......我只需要一行中的所有值。 @mathguy – spikeTJ

+0

你能推荐我一个更有效的方法吗? @mathguy – spikeTJ

回答

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; 
+0

但我如何加入到第一个查询? @scaisEdge – spikeTJ

+0

我尝试多次这种方式,但我得到了这个错误:ORA-00923:从关键字找不到预期的地方。我已经查看了语法并找不到任何错误。 @scaisEdge – spikeTJ

+0

我有这个版本的Oracle:Oracle数据库10g企业版版本10.2.0.5.0 - 64bi。我认为listagg适用于11.2或更高版本。 @scaisEdge – spikeTJ