Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Conexão de string agregada no Oracle 10g


O Oracle 11g tem essa função LISTAGG legal que é praticamente o que você deseja, no entanto, como você está no 10g, isso não está disponível para você (a menos que você decida atualizar).

Se por algum motivo você não quiser (ou não puder por qualquer motivo) atualizar para 11g, sugiro que você veja algumas alternativas ao LISTAGG que estão disponíveis para você em 10g.

Você pode conferir algumas das alternativas propostas aqui

Rapidamente ajustado uma rápida adaptação de uma das alternativas propostas para corresponder ao seu cenário de 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;

Mas lembre-se que esta não é a solução real, pois você terá que adaptá-la de acordo com sua tabela (não a mesa DUAL fictícia) etc ...

Sua solução provavelmente parecerá algo ao longo das linhas de:
SELECT   POD,
         RTRIM(
            XMLAGG (XMLELEMENT(E, NAME||',') ORDER BY NAME).EXTRACT('//text()'),
            ','
         ) AS NAME
    FROM tbl1
GROUP BY POD;

Se você quiser alterar o delimitador, pode alterá-lo de vírgula nesta parte:
(E, NAME||',')

O RTRIM está lá apenas para cortar a vírgula final do final da string concatenada, se você não se incomodar com a vírgula final, pode omitir a função RTRIM para conservar a legibilidade.