2017-07-13 5 views
0

Oracle Database Enterprise Edition 12c Veröffentlichung 12.1.0.2.0 Jemand, der mich mit meiner AnfrageOracle Datenbank concat Spalte

Oracle helfen könnte
**TABLE A**   **TABLE B**   **TABLE usuarios** 

    RU     RU  DESCRIP  iduser 
================== ==================== ======================= 
| adm   | | adm | hi  | | 1     | 
| adm   | | adm | help  | | 1     | 
| adm   | | adm | me  | | 1     | 
| usr   | | urs | good day | | 1     | 
| rhm   | | rhm | s  | | 1     | 

Tabelle usuario ist Referenz >>Tabelle A und Tabelle A Referenz >>Tabelle B

diese meine Abfrage ist und das Ergebnis dieser

adm = ist hallo, hallo, hallo

SELECT case row_number() 
over (partition by A.ru by B.descrip) WHEN 1 
THEN A.RU 
END as RU, 
LISTAGG(B.descrip, ', ') 
WITHIN GROUP (ORDER BY A.RU) "names" 
FROM A 
INNER JOIN usuarios on usuarios.iduser = A.iduser 
LEFT JOIN B ON B.RU = A.RU 
WHERE A.iduser = 1 
GROUP BY A.RU, B.descrip 
ORDER BY A.RU, B.descrip 

und ich brauche dieses Ergebnis

RESULT 

adm = hi help me 
usr = good day 
rhm = s 
+2

Ich habe Angst, Ihren Tisch B einige wichtige Informationen über die _order_ fehlt, die jeder Beschreibung Begriff nehmen sollte. –

+0

Zusätzlich zu Tims Frage (wie bestimmen Sie, in welcher Reihenfolge die Werte zu verketten sind?) Gibt es mindestens zwei weitere wichtige Fragen. (1) Welche Version von Oracle haben Sie? Verschiedene Tools sind in verschiedenen Versionen verfügbar. Raten Sie nicht; Führen Sie 'select * from v $ version' aus und melden Sie sich mit der vollständigen (fünfteiligen) Version wie 12.1.0.2.0 zurück. (2) Ist es möglich, dass das Ergebnis der Verkettung sehr lang ist (über 4000 Bytes)? Welche Werkzeuge Sie benötigen, hängt stark davon ab. – mathguy

+0

In Ihrem bestehenden Code ist die erste Sache, die herausragt (und das unerwartete Ergebnis verursacht), dass Sie nach 'ru' ** und nach **' descrip 'gruppieren. Sie sollten nicht nach 'descrip 'gruppieren. – mathguy

Antwort

0

dies ist meine neue Abfrage

SELECT A.RU, 
LISTAGG(B.descrip, ',') WITHIN GROUP (ORDER BY B.descrip) 
over (partition by A.RU) B 
FROM A 
inner join usuarios on usuarios.iduser = A.RU 
left join B on B.RU = A.RU 
where  A.iduser = 1 
GROUP BY A.RU, B.descrip 
order by A.RU, B.descrip; 


table result 
================= 
RU  descrip  
================= 
adm hi help me 
adm hi help me 
adm hi help me 
usr good day 
rhm s 

Ich brauche nur

adm hi help me 
usr good day 
rhm s 
0

RICHTIG QUERY:

select distinc * from (
    SELECT A.RU, 
    LISTAGG(B.descrip, ',') WITHIN GROUP (ORDER BY B.descrip) 
    over (partition by A.RU) B 
    FROM A 
    inner join usuarios on usuarios.iduser = A.RU 
    left join B on B.RU = A.RU 
    where  A.iduser = 1 
    GROUP BY A.RU, B.descrip 
    order by A.RU, B.descrip 
);