¿Como hacer select de un inner join con multiples rows?

publicado por: Anonymous

Tengo un Query con la que intento traerme varios valores con un solo inner join, pero la cuestión es que me trae los diferentes valores como filas, por lo tanto me repite datos, lo que deseo es hacer un select de cada valor que trae el inner join para mostrarlos en diferentes columnas y de esta manera, no repetir los demas campos. acá agrego un ejemplo.

SELECT t3.valor,t1.* FROM tabla1 t1

   INNER JOIN tabla2 t2 --tabla intermedia entre t1 y t3 
         ON t1.id=t2.id

   INNER JOIN tabla3 t3 
         ON t2.id=t3.id


T3.VALOR            T1.ID       T1.EXPEDIENTE     T1.NOMBRECOMPLETO
Valor1                 1        10184488          JONATHAN GONZALEZ LOPEZ
Valor2                 1        10184488          JONATHAN GONZALEZ LOPEZ
Valor3                 1        10184488          JONATHAN GONZALEZ LOPEZ

lo que quiero es que las filas de la columna llama “VALOR”, sean columnas diferentes, quedando de la siguiente manera:

T3.VALOR1   T3.VALOR2    T3.VALOR3   T1.ID    T1.EXPEDIENTE  T1.NOMBRECOMPLETO
Valor1      Valor2       Valor3      1        10184488       JONATHAN GONZALEZ LOPEZ

solución

Si estás usando una versión de Oracle 11G o posterior, puedes hacer uso de la sentencia PIVOT. Te dejo a continuación un ejemplo de como funciona.

WITH CARACTERISTICA_PERSONA AS (
     SELECT 1 ID_PERSONA, 'Nombre' CARACTERISTICA, 'Pedro' VALOR FROM DUAL UNION ALL
     SELECT 1, 'Apellido', 'Perez' FROM DUAL UNION ALL
     SELECT 1, 'Edad', '33' FROM DUAL UNION ALL
     SELECT 2, 'Nombre', 'Camila' FROM DUAL UNION ALL
     SELECT 2, 'Apellido', 'Páez' FROM DUAL UNION ALL
     SELECT 2, 'Edad', '12' FROM DUAL UNION ALL
     SELECT 3, 'Nombre', 'Esteban' FROM DUAL UNION ALL
     SELECT 3, 'Apellido', 'Abondano' FROM DUAL UNION ALL
     SELECT 3, 'Edad', '20' FROM DUAL)
SELECT *
FROM CARACTERISTICA_PERSONA CP
PIVOT (MAX(VALOR) AS VALOR FOR (CARACTERISTICA)  IN ('Nombre', 'Apellido', 'Edad'))

Centrate en la parte del último SELECT, el WITH es solo para simular una tabla. Aquí está el resultado del query anterior:

Resultado de query PIVOT

De cualquier forma, te dejo también un enlace a un ejemplo completo de la sentencia PIVOT. En este mismo enlace encontrarás una solución alternativa a PIVOT para versiones de Oracle anteriores a la 11G.

https://oracle-base.com/articles/11g/pivot-and-unpivot-operators-11gr1

Edito mi respuesta agregando solución para Oracle 10.

 WITH CARACTERISTICA_PERSONA AS (
         SELECT 1 ID_PERSONA, 'Nombre' CARACTERISTICA, 'Pedro' VALOR FROM DUAL UNION ALL
         SELECT 1, 'Apellido', 'Perez' FROM DUAL UNION ALL
         SELECT 1, 'Edad', '33' FROM DUAL UNION ALL
         SELECT 2, 'Nombre', 'Camila' FROM DUAL UNION ALL
         SELECT 2, 'Apellido', 'Páez' FROM DUAL UNION ALL
         SELECT 2, 'Edad', '12' FROM DUAL UNION ALL
         SELECT 3, 'Nombre', 'Esteban' FROM DUAL UNION ALL
         SELECT 3, 'Apellido', 'Abondano' FROM DUAL UNION ALL
         SELECT 3, 'Edad', '20' FROM DUAL)
    SELECT CP.ID_PERSONA,
           MAX(DECODE(CP.CARACTERISTICA, 'Nombre', CP.VALOR)) AS NOMBRE,
           MAX(DECODE(CP.CARACTERISTICA, 'Apellido', CP.VALOR)) AS APELLIDO,
           MAX(DECODE(CP.CARACTERISTICA, 'Edad', CP.VALOR)) AS EDAD
    FROM CARACTERISTICA_PERSONA CP
    GROUP BY CP.ID_PERSONA
    ORDER BY CP.ID_PERSONA

Saludos

Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *