sql >> Databáze >  >> RDS >> Oracle

Agregované řetězcové připojení v Oracle 10g

Oracle 11g má tuto elegantní funkci LISTAGG, která je v podstatě to, co chcete, ale protože máte 10 g, není vám k dispozici (pokud se nerozhodnete upgradovat).

Pokud si z nějakého důvodu nepřejete (nebo nemůžete z jakýchkoli důvodů) upgradovat na 11g, navrhoval bych podívat se na některé alternativy k LISTAGG, které máte k dispozici na 10g.

Můžete se podívat na některé z navrhovaných alternativ zde

Rychle upravit rychlou úpravu jedné z navrhovaných alternativ, aby odpovídala vašemu případu:

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;

Ale pamatujte, že toto není skutečné řešení, protože ho budete muset upravit podle vašeho stolu (ne falešného DUAL stolu) atd...

Vaše řešení bude pravděpodobně vypadat takto:

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

Pokud chcete změnit oddělovač, můžete jej změnit z čárky v této části:

(E, NAME||',')

RTRIM slouží pouze k odstřižení koncové čárky z konce zřetězeného řetězce. Pokud vás koncová čárka neobtěžuje, můžete funkci RTRIM vynechat, abyste zachovali čitelnost.



  1. JSON_MERGE_PRESERVE() – Sloučit více dokumentů JSON v MySQL

  2. Eliminace MySQL Split-Brain v multi-cloudových databázích

  3. Alternativa operátora v mysql

  4. Používá MySQL index pro řazení?