2016-07-13 19 views
0

Ich schreibe eine ORACLE Select-Anweisung mit LISTAGG. Es funktioniert, aber als ich die Daten validierte, sah ich Duplikate wie 1: 1,1: 1,2: 2,2: 2.Oracle LISTAGG Fall geben unterschiedliche Werte zurück

Ich verifizierte, dass die Datenbank doppelte haben. Die Abfrage betrifft zwei Tabellen in einer Eins-zu-viele-Beziehung. Unten ist ein Ausschnitt meiner Frage, aber ich ändere die Spaltennamen usw.

Wie kann ich die folgende Abfrage ändern, um eindeutige Werte für jede Person zurückzugeben?

Dank

SELECT Table1.PERSON_ID, 
     Table1.FIRST_NAME, 
     Table1.MIDDLE_NAME, 
     Table1.LAST_NAME, 

LISTAGG(case 
     when Table2.DESCRIPTION = '1' then '1:1' 
     when Table2.DESCRIPTION = '2' then '2:2' 
     when Table2.DESCRIPTION = '3' then '3:3' 
     when Table2.DESCRIPTION = '4' then '4:4' 
     when Table2.DESCRIPTION = '5' then '5:5' 
     when Table2.DESCRIPTION = '6' then '6:6' 
     when Table2.DESCRIPTION = '7' then '7:7' 
     when Table2.DESCRIPTION = '8' then '8:8' 
     when Table2.DESCRIPTION = '9' then '9:9' 


     else '' 

end, ',') 
WITHIN GROUP (ORDER BY Table2.DESCRIPTION) 

FROM Table1 
LEFT JOIN Table2 

ON Table2.PERSON_ID = Table1.PERSON_ID 
GROUP BY Table1.PERSON_ID,Table1.FIRST_NAME,Table1.MIDDLE_NAME, Table1.LAST_NAME 

Antwort

0

Table2 hat PERSON_ID als Fremdschlüssel zeigt auf Table1 Unter der Annahme, was Sie tun müssen, ist ersetzen

FROM Table1 
LEFT JOIN Table2 
ON Table2.PERSON_ID = Table1.PERSON_ID 

mit

FROM Table1 
LEFT JOIN 
(SELECT DISTINCT PERSON_ID, DESCRIPTION FROM Table2) T2 
ON T2.PERSON_ID = Table1.PERSON_ID 

und dann Table2-T2 in LISTAGG() ändern (einschließlich der WITHIN GROUP (ORDER BY ...) Klausel!)

+0

Danke mathguy, deine Antwort hat funktioniert !!!! – John

2

In Oracle, müssen Sie die DISTINCT in einer Unterabfrage tun:

SELECT PERSON_ID, FIRST_NAME, MIDDLE_NAME, LAST_NAME, 
     LISTAGG(val, ',') WITHIN GROUP (ORDER BY DESCRIPTION) 
FROM (SELECT DISTINCT Table1.PERSON_ID, Table1.FIRST_NAME, Table1.MIDDLE_NAME, Table1.LAST_NAME, Table2.Description 
      (case when Table2.DESCRIPTION = '1' then '1:1' 
        when Table2.DESCRIPTION = '2' then '2:2' 
        when Table2.DESCRIPTION = '3' then '3:3' 
        when Table2.DESCRIPTION = '4' then '4:4' 
        when Table2.DESCRIPTION = '5' then '5:5' 
        when Table2.DESCRIPTION = '6' then '6:6' 
        when Table2.DESCRIPTION = '7' then '7:7' 
        when Table2.DESCRIPTION = '8' then '8:8' 
        when Table2.DESCRIPTION = '9' then '9:9' 
        else '' 
       end) as val 
     FROM Table1 LEFT JOIN 
      Table2 
      ON Table2.PERSON_ID = Table1.PERSON_ID 
    ) 
GROUP BY PERSON_ID, FIRST_NAME, MIDDLE_NAME, LAST_NAME; 
+0

ich meine Abfrage als angegeben korrigieren. Ich erhalte den folgenden Fehler: ORA-00904: "DBName". "VIEW". "BESCHREIBUNG": ungültiger Bezeichner. In der veröffentlichten Abfrage lautet DBNAME.VIEW 'Table2'. Ich versuche herauszufinden, wie ich das beheben kann. – John

+0

In Oracle können Sie nicht auf einen Tabellennamen verweisen, wenn er mehr als eine Ebene innerhalb der äußeren Abfrage verschachtelt ist. Hier erscheint Tabelle2 in der innersten Unterabfrage (der Join), sie erscheint nicht in der mittleren Unterabfrage und wird in der äußeren Abfrage verwendet. Um es zu speichern, sollte die mittlere Abfrage einen Namen erhalten und dieser Name sollte in der äußeren Abfrage verwendet werden. Oder sagen Sie einfach 'DESCRIPTION' in' ORDER BY'. ABER: Diese Lösung macht keinen Sinn. 'SELECT DISTINCT' sollte vor dem Join auf 'Table2' erfolgen, nicht auf dem Ergebnis des Joins. Reparieren Sie es wie vorgeschlagen und vergleichen Sie EXECUTE PLAN für die beiden angebotenen Lösungen. – mathguy

+0

@ John. . . Die innere Abfrage muss einfach 'DESCRIPTION' zurückgeben. –

Verwandte Themen