2016-08-01 7 views
0

ich habe diese Anfrage:Wie in einer Zeile der Ausgabe mehrere Zeilen Werte zur Anzeige

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; 

ich es in der Regel verwenden, um die applications_code zu wissen, dass ein Benutzer Zugriff entsprechend ihrer charge_code, unit_code und role_code hat

Und ist dies die Ergebnisse der Abfrage oben:

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 

zuvor ich perfekt funktionierte, aber jetzt nehmen s mehr als 10 Minuten aufgrund der großen Anzahl von Datensätzen.

Ich versuche, das folgende Ergebnis zu erhalten:

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 

Hinweis: Diese Aufzeichnungen sind jede Tabelle zeigt.

  • Die table_1: user_code/charge_code/unit_code
  • Die table_2: role_code/apps_code
  • Die table_3: role_code/user_code

ich eine Abfrage wie folgt zu implementieren bin versucht:

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

sein Warum Sie die Ausgabe in diesem aggregiert (Comma Separated) Format wollen? Vielleicht gibt es effizientere Möglichkeiten, um das zu tun, was Sie letztendlich tun müssen. – mathguy

+0

Das Ausgabeformat ist nicht wichtig ... Ich brauche nur alle Werte in einer Zeile. @mathguy – spikeTJ

+0

Können Sie mir einen effizienteren Weg empfehlen? @mathguy – spikeTJ

Antwort

1

Sie LISTAGG

verwenden könnte
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 

und für Ihre Anfrage

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; 

mit wm_concat() sollte

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

aber wie kann ich mit der ersten Abfrage verbinden? @scaisEdge – spikeTJ

+0

Ich versuche oft so, aber ich habe diesen Fehler: ORA-00923: FROM Schlüsselwort nicht gefunden, wo erwartet. Ich habe die Syntax überprüft und kann keine Fehler finden. @scaisEdge – spikeTJ

+0

Ich habe diese Version von Oracle: Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - 64bi. Ich denke, dass listagg auf 11.2 oder höher arbeitet. @scaisEdge – spikeTJ