2012-04-11 5 views
2

Neu in SQL und eine Abfrage haben, ziehen einige Daten mit einer Anzahl von Joins über eine Reihe von Tabellen.SQL-Abfrage - eindeutig oder eindeutig?

Beispieldaten:

PERSON_NAME FUNCTION_NAME FUNCTION_ID FUNCTION_GROUP 

Bob   View Result 1   Editor 
Bob   Edit Result 4   Editor 
Bob   Delete Result 3   Editor 
Bob   Email Result 8   Editor 
Mary  Print Letter 45   Admin 
Mary  Grant Access 37   Admin 

Funktionen IDs haben, und function_groups haben zahlreiche Funktionen. Ich möchte die Daten abzufragen so statt, wie es oben auf das Beispiel ähnlich zu sein scheint, würde es wie folgt aussehen:

PERSON_NAME FUNCTION_NAME        FUNCTION_ID  FUNCTION_GROUP 

Bob   View Result,Edit Result, Delete Result 1,4,3,8   Editor 
Mary  Print Letter,Grant Access     45,37   Admin 

„Bob gehört Editor, Editor folgende Funktionen hat“, wie ein Ergebnis, anstatt der Anfangs Beispiel, wo mehrere Zeilen nach Zeilen zurückgegeben werden.

Bin ich richtig, wenn ich denke, dass die eindeutigen oder eindeutigen Schlüsselwörter mir helfen können? Danke!

EDIT: Jetzt mit Code

select staff_member.person_name, function.function_name,staff_group_function.function_id, staff_group.function_group_name 
from staff_member 
inner join staff_group 
on staff_group.staff_group_id=staff_group_member.staff_group_id 
inner join staff_group_function 
on staff_group_function.staff_group_id=staff_group_member.staff_group_id 
inner join function 
on function.function_id=staff_group_function.function_group_name 

Antwort

4

Nope. Was Sie brauchen, ist LISTAGG(), wenn Sie Oracle 11g2 haben.

SELECT person_name, 
     LISTAGG(function_name, ', ') WITHIN GROUP (ORDER BY 1) function_name, 
     LISTAGG(function_id, ', ') WITHIN GROUP (ORDER BY 1) function_id, 
     function_group 
FROM my_table 
GROUP BY person_name, function_group 

alternativ (nach Ihrem letzten Kommentar): Diese Abfrage könnte

SELECT person_name, 
     LISTAGG(function_name, ', ') WITHIN GROUP (ORDER BY 1) function_name, 
     LISTAGG(function_id, ', ') WITHIN GROUP (ORDER BY 1) function_id, 
     LISTAGG(function_group, ', ') WITHIN GROUP (ORDER BY 1) function_group 
FROM my_table 
GROUP BY person_name 

Für jede Version vor 11g2, diese interessanten Artikeln halten die Lösung für Sie:

http://www.oracle-base.com/articles/misc/string-aggregation-techniques.php

+0

Oder in etwa 10 Minuten, um dieses Verhalten zu implementieren in jeder Turing komplette Programmiersprache – ControlAltDel

+0

Mit 10G. Nützlicher Link! wmsys.concat funktioniert. :) Allerdings möchte ich eigentlich nur eine Instanz von Bob, vergiss den Funktionsnamen für den Moment. Wie kann ich Bob/Mary nur einmal als Mitglied von Editor/Admin angeben? – GrumP

+0

@GrumP: Ich vermute, dann habe ich Ihr Ziel falsch interpretiert. Versuchen Sie die Gruppierung nur nach 'person_name' und aggregieren' function_group' auf die gleiche Weise wie die anderen Felder ... –

2

UNIQUE und DISTINCT haben nichts mit der Gruppierung und Aggregation Ihrer Ergebnisse zu tun. Sie müssen GROUP BYPERSON_NAME und FUNCTION_GROUP und dann Ihre eigenen aggregate function anwenden, um die verbleibenden Ergebnisse zu gruppieren.

Diese article sagt Ihnen genau, wie mit Kommas-Strings über eine Aggregatfunktion in Oracle mit LISTAGG verkettet werden.

1

In 10g es funktioniert wie unter

with tab as (
select 'Bob' PERSON_NAME,'View Result' FUNCTION_NAME,'1' FUNCTION_ID,'Editor' FUNCTION_GROUP  from dual 
union all 
select 'Bob' PERSON_NAME,'Edit Result' FUNCTION_NAME,'4' FUNCTION_ID,'Editor' FUNCTION_GROUP from dual 
union all 
select 'Bob' PERSON_NAME ,'Delete Result'FUNCTION_NAME,'3' FUNCTION_ID,'Editor' FUNCTION_GROUP from dual 
union all 
select 'Bob' PERSON_NAME,'Email Result' FUNCTION_NAME,'8' FUNCTION_ID,'Editor' FUNCTION_GROUP from dual 
union all 
select 'Mary' PERSON_NAME,'Print Letter' FUNCTION_NAME,'45' FUNCTION_ID,'Admin' FUNCTION_GROUP from dual 
union all 
select 'Mary' PERSON_NAME , 'Grant Access' FUNCTION_NAME ,'37' FUNCTION_ID,'Admin' FUNCTION_GROUP from dual 
) 
select person_name 
     ,wm_concat(function_name) function_name 
     ,wm_concat(function_id) function_id 
     ,function_group 
from tab 
group by person_name,function_group 

Ausgang output

+0

Hallo Gaurav, das ist genau was ich will. Ich habe versucht, meinen Code zu ändern, um diese Logik zu implementieren, aber ich habe es nicht richtig gemacht. Mit der Probe sql in meiner ursprünglichen Frage, können Sie beraten, wie ich ändern kann, um die Ausgabe zu produzieren, die Sie haben? Vielen Dank! – GrumP

+0

@Philleh: Bitte geben Sie den Code, was hast du probiert? –

+0

Hallo, es ist in meinem ursprünglichen Beitrag. – GrumP