2016-04-13 23 views
0

Eine Tabelle listet eine Vielzahl von employee_ids mit einem Job auf.oracle 11g listagg mit der Referenz-ID

Die Namen der Mitarbeiter sind in einer separaten Tabelle aufgeführt. Aktionsnamen befinden sich ebenfalls in einer zusätzlichen Tabelle.

Die Listagg-Anweisung zum Aggregieren der Mitarbeiter-IDs ist einfach genug, aber die Namen der Mitarbeiter müssen aufgelistet werden.

Zusätzlich muss die Aktions-ID innerhalb jedes Jobs dem Mitarbeiter für die Aktion zugeordnet werden.

select job.id, 
     listagg(hist.empl_id, ',') within group (order by job.id) as emp_list, 
     listagg(hist.ACTION_ID, ',') within group (order by job.id) as  actionid_list 
from jobs job, 
     job_action_log hist   
where job.id = hist.job_id 
     group by job.id; 

Dies gibt die Jobid-, aggregierte empid- und aggregierte Aktions-ID korrekt zurück.

job employee  action 
------------------------------- 
14 9, 12, 14, 9 5, 7, 88, 5 

, was benötigt wird, ist den Namen des Mitarbeiters aus dem Mitarbeitertisch zurückzukehren, einen Aktionsnamen aus einer anderen Tabelle Aktion id Liste und die Namen der Aktionen und die richtigen Mitarbeiter mit der richtigen Aktion zu verknüpfen.

gewünschten Ergebnisse:

jobid employee name   action 
    ------------------------------------------------------ 
    14 Bob, Joe, Sam, Linda sweep, glass, mop, sweep 

irgendwelche Vorschläge oder Hilfe sehr geschätzt.

Antwort

2

Nur join die anderen zwei Tabellen und wählen Sie die erforderlichen Felder (ändern Sie sie, um angemessen zu sein) in listagg. Außerdem sollten Sie keine Joins im alten Stil mehr verwenden.

select 
job.id, 
listagg(e.employee_name, ',') within group (order by job.id) as emp_list, 
listagg(a.action_name, ',') within group (order by job.id) as actionid_list 
from jobs job 
join job_action_log hist on job.id = hist.job_id 
join actions a on a.id = hist.action_id 
join employees e on e.employee_id = hist.empl_id 
group by job.id; 
+0

glatt .. danke !! – user761758