Oracle
 sql >> Base de données >  >> RDS >> Oracle

Connexion de chaîne agrégée dans Oracle 10g

Oracle 11g a cette fonction soignée LISTAGG qui correspond à peu près à ce que vous voulez, mais puisque vous êtes sur 10g, cela ne vous est pas disponible (sauf si vous décidez de mettre à niveau).

Si, pour une raison quelconque, vous ne souhaitez pas (ou ne pouvez pas, pour quelque raison que ce soit) passer à 11g, je vous suggère de rechercher des alternatives à LISTAGG qui sont à votre disposition sur 10g.

Vous pouvez consulter certaines des alternatives proposées ici

Rapidement ajusté une adaptation rapide de l'une des alternatives proposées pour correspondre à votre scénario de cas :

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;

Mais rappelez-vous que ce n'est pas la solution réelle car vous devrez l'adapter en fonction de votre table (pas de la table factice DUAL) etc...

Votre solution ressemblera probablement à quelque chose comme :

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

Si vous souhaitez modifier le délimiteur, vous pouvez le remplacer par une virgule dans cette partie :

(E, NAME||',')

Le RTRIM est là juste pour couper la virgule de fin de la chaîne concaténée, si vous n'êtes pas dérangé par la virgule de fin, vous pouvez omettre la fonction RTRIM pour conserver la lisibilité.