Oracle
 sql >> Database >  >> RDS >> Oracle

Connessione stringa aggregata in Oracle 10g

Oracle 11g ha questa funzione ordinata LISTAGG che è praticamente ciò che desideri, tuttavia poiché sei su 10g questo non è disponibile per te (a meno che tu non decida di eseguire l'aggiornamento).

Se per qualche motivo non desideri (o non puoi per qualsiasi motivo) eseguire l'aggiornamento a 11 g, ti suggerisco di cercare alcune alternative a LISTAGG che sono disponibili per te su 10 g.

Puoi controllare alcune delle alternative proposte qui

Adattamento rapido di una delle alternative proposte per adattarla allo scenario del tuo caso:

WITH Q AS
(
    SELECT 'North' POD, 'Rony' NAME FROM DUAL  UNION ALL
    SELECT 'North',     'James'     FROM DUAL  UNION ALL
    SELECT 'North',     'Aby'       FROM DUAL  UNION ALL
    SELECT 'South',     'Sam'       FROM DUAL  UNION ALL  
    SELECT 'South',     'Willy'     FROM DUAL  UNION ALL
    SELECT 'West',      'Mike'      FROM DUAL
)
SELECT   POD,
         RTRIM(
            XMLAGG (XMLELEMENT(e, name||',') ORDER BY name).EXTRACT('//text()'),
            ','
         ) AS name
    FROM q
GROUP BY POD;

Ma ricorda che questa non è la vera soluzione in quanto dovrai adattarla in base al tuo tavolo (non al tavolo DUAL fittizio) ecc...

La tua soluzione probabilmente avrà un aspetto simile a:

SELECT   POD,
         RTRIM(
            XMLAGG (XMLELEMENT(E, NAME||',') ORDER BY NAME).EXTRACT('//text()'),
            ','
         ) AS NAME
    FROM tbl1
GROUP BY POD;

Se vuoi cambiare il delimitatore puoi cambiarlo dalla virgola in questa parte:

(E, NAME||',')

L'RTRIM è lì solo per tagliare la virgola finale dalla fine della stringa concatenata, se non sei infastidito dalla virgola finale puoi omettere la funzione RTRIM per preservare la leggibilità.