es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Concatene columnas de varias tablas en una sola fila sin duplicados.

Necesito concatenar dos columnas de tablas diferentes, delimitadas con “;”, en una fila sin duplicados.

Tabla 1:

Nombre
John;Sue

Tabla 2:

Nombre
Mary;John

Salida deseada:

Nombres
John;Sue;Mary

Intenté con :

select listagg(a.Name, ';') within group (order by a.Name) as Names
from Table1 a
join Table2 b on a.id = b.id;

pero obtengo el error “ORA-01489: resultado de concatenación de cadenas es demasiado largo”.

¿Cómo puedo hacer esto adecuadamente en Oracle?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para evitar el error ORA-01489, puede utilizar la palabra clave DISTINCT en la función listagg para eliminar duplicados antes de concatenar las cadenas. Aquí hay una consulta de ejemplo que debería funcionar para su caso:

    SELECT listagg(distinct Names, ';') within group (order by Names) as Names
    FROM (
      SELECT Name as Names FROM Table1
      UNION
      SELECT Name as Names FROM Table2
    ) t;
    

    Esta consulta combina primero los nombres de ambas tablas utilizando el operador UNION, que elimina duplicados por defecto. Después, la función listagg concatena los nombres distintos en una sola cadena, con puntos y comas como delimitadores.

    Tenga en cuenta que todavía puede encontrarse con el error ORA-01489 si la cadena concatenada supera la longitud máxima permitida en Oracle. En ese caso, puede aumentar la longitud máxima (por ejemplo, mediante la configuración del parámetro MAX_STRING_SIZE en EXTENDED) o particionar la función listagg en múltiples cadenas más pequeñas utilizando la cláusula OVER.

Comments are closed.