none
Inner Join repite campos al enlazar la tercera tabla. RRS feed

  • Pregunta

  • Estoy tratando de unir 3 tablas con Inner Join, las primeras 2 tablas el resultado es correcto, pero cuando intento con la tercera me salen los campos repetidos. Muchas gracias de antemanos.
    miércoles, 7 de diciembre de 2016 16:04

Respuestas

  • Nazaret Garcia,

    Significa que en la tabla [productos] se encuentran 43 filas para el TIPO_PRODUCTO 1, 24 filas para el TIPO_PRODUCTO 2, 19 filas para el TIPO_PRODUCTO 3, etc. 

    ¿Estás segur@ que no existe otra columna que identifique de manera unívoca a cada fila de la tabla 'productos'?. Al tener filas aparentemente duplicadas es de esperar que la combinación genere la misma cantidad de resultados, es decir, si la columna 'PRE.PRODUCTO' tiene el valor de 1 al combinarlo con la columna 'PRO.TIPO_PRODUCTO' resultarán 43 filas producto de la combinación, si la columna 'PRE.PRODUCTO' tiene el valor de 2 al combinarlo con la columna 'PRO.TIPO_PRODUCTO' resultarán 24 filas producto de la combinación, etc.

    En ese sentido, lo primero es analizar que columna es candidata a ser clave primaria y en caso sea la columna que mencionas analizar el porque de las filas duplicadas (de hecho por el nombre de la columna me parecería raro que contenga filas únicas, el nombre de la columna sugiere clasificación, no identificación), ¿en realidad toda la fila está duplicada?. Yo sigo pensando que estás tomando la columna equivocada (de la tabla [productos]) para definir la expresión condicional de la cláusula ON.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Propuesto como respuesta Joyce_ACModerator jueves, 8 de diciembre de 2016 16:15
    • Marcado como respuesta Nazaret Garcia jueves, 8 de diciembre de 2016 16:18
    • Desmarcado como respuesta Nazaret Garcia jueves, 8 de diciembre de 2016 16:18
    • Marcado como respuesta Nazaret Garcia jueves, 8 de diciembre de 2016 16:19
    jueves, 8 de diciembre de 2016 14:49

Todas las respuestas

  • Nazaret Garcia,

    El resultado es de esperar en caso la combinación encuentre 2 o más filas coincidentes en la tabla con la que comparas. La solución va a depender según lo que intentas mostrar en la lista de selección que por lo general se soluciona comparando contra filas únicas, las cuales previamente fueron discriminadas en un sub-conjunto de resultados como una tabla derivada, una variable de tipo table, una CTE, etc.

    ¿Es posible que nos adjuntes la consulta que tienes para ver si podemos ayudarte a resolver el caso?


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    miércoles, 7 de diciembre de 2016 16:13
  • SELECT TOP 10 nombre_cliente, 
                    Max (monto_real_credito)AS MONTOCREDITO,
                    fecha_escritura,
                    fecha_vence,
                    PRE.fecha_proceso,
                    CLI.fecha_proceso, 
                    saldo_capital,
                    interes_mes,
                    interes_acumulado,
                    tipo_credito,
                    saldo_int,
                    estatus_legal,
                    status_2,
                    CLI.UNIDAD_NEGOCIO,
                    CLI.CODIGO_CUENTA,
                    PRO.TIPO_PRODUCTO, PRO.SUB_PRODUCTO, PRO.MONEDA, PRO.CUENTA_CONTABLE,PRO.FECHA_PROCESO
                    
    FROM   dbo.maestro_prestamo as PRE
    INNER JOIN dbo.maestro_cliente AS CLI
    ON PRE.DOCUMENTO = CLI.codigo_cuenta
    INNER JOIN dbo.productos as PRO
    ON PRO.TIPO_PRODUCTO = PRE.PRODUCTO
    WHERE  (FECHA_ESCRITURA < '20151531') AND (CONVERT(DATETIME, FECHA_VENCE, 103) > '20161031' 
           ) 
    GROUP  BY nombre_cliente, 
     monto_real_credito,
     fecha_escritura,
     fecha_vence,
              PRE.fecha_proceso, 
              CLI.fecha_proceso,  
              saldo_capital,
              interes_mes,
              interes_acumulado,
              tipo_credito,
              saldo_int,
              estatus_legal,
              status_2,
              CLI.UNIDAD_NEGOCIO,
              CLI.CODIGO_CUENTA,
              PRO.TIPO_PRODUCTO, PRO.SUB_PRODUCTO, PRO.MONEDA, PRO.CUENTA_CONTABLE,PRO.FECHA_PROCESO
             
              
    ORDER BY MONTO_REAL_CREDITO DESC;

    miércoles, 7 de diciembre de 2016 17:51
  • Nazaret Garcia,

    Dos puntos:

    1. Coloca por favor el alias a todas las columnas ya que no se puede determinar la pertenencia de las columnas respecto a sus tablas.
    2. ¿Cuál es el objetivo de relacionar la consulta con la tabla [productos] (respecto a la lista de selección)?


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    miércoles, 7 de diciembre de 2016 19:05
  • Hice lo que me dijiste y sigue dando el mismo resultado, el objetivo es entregar un informe con esos datos,

    aqui te dejo el Query:

    SELECT TOP 10 PRE.nombre_cliente, 
                    Max (monto_real_credito)AS MONTOCREDITO,
                    PRE.fecha_escritura,
                    PRE.fecha_vence,
                    PRE.fecha_proceso,
                    PRE.fecha_proceso, 
                    PRE.saldo_capital,
                    PRE.interes_mes,
                    PRE.interes_acumulado,
                    PRE.tipo_credito,
                    PRE.saldo_int,
                    PRE.estatus_legal,
                    PRE.status_2,
                    CLI.UNIDAD_NEGOCIO,
                    CLI.CODIGO_CUENTA,
                    PRO.TIPO_PRODUCTO, PRO.SUB_PRODUCTO, PRO.MONEDA, PRO.CUENTA_CONTABLE,PRO.FECHA_PROCESO
                    
    FROM   dbo.maestro_prestamo as PRE
    INNER JOIN dbo.maestro_cliente AS CLI
    ON PRE.DOCUMENTO = CLI.codigo_cuenta
    INNER JOIN dbo.productos as PRO
    ON PRO.TIPO_PRODUCTO = PRE.PRODUCTO
    WHERE  (FECHA_ESCRITURA < '20151531') AND (CONVERT(DATETIME, FECHA_VENCE, 103) > '20161031' 
           ) 
    GROUP  BY PRE.nombre_cliente, 
     PRE.monto_real_credito,
     PRE.fecha_escritura,
     PRE.fecha_vence,
              PRE.fecha_proceso, 
              PRE.fecha_proceso,  
              PRE.saldo_capital,
              PRE.interes_mes,
              PRE.interes_acumulado,
              PRE.tipo_credito,
              PRE.saldo_int,
              PRE.estatus_legal,
              PRE.status_2,
              CLI.UNIDAD_NEGOCIO,
              CLI.CODIGO_CUENTA,
              PRO.TIPO_PRODUCTO, PRO.SUB_PRODUCTO, PRO.MONEDA, PRO.CUENTA_CONTABLE,PRO.FECHA_PROCESO
             
              
    ORDER BY MONTO_REAL_CREDITO DESC;


    miércoles, 7 de diciembre de 2016 19:14
  • Nazaret Garcia,

    No, el colocar el alias a las columnas no iba a corregir el problema, lo solicité porque tal y como lo tenías no tenía claro la asociación entre columnas y tablas.

    ¿La columna 'monto_real_credito' a que tabla pertenece?.

    ¿La cláusula ON { ON PRO.TIPO_PRODUCTO = PRE.PRODUCTO } no debería combinar la tabla [productos] por una columna 'PRODUCTO', 'CODIGO' o algo similar? ¿Por qué tipo de producto?


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    miércoles, 7 de diciembre de 2016 19:46
  • La columna 'monto_real_credito' pertenece a  dbo.maestro_prestamo, las tablas no tienen Primary Key.

    Trato de hacerlo con campos que son los mismos, mismo tipo de dato y esas conjeturas.

    Pero vuelve y me lanza los campos duplicados desde el principio.

    miércoles, 7 de diciembre de 2016 20:08
  • Nazaret Garcia,

    De acuerdo, antes de hacer cualquier modificación a la consulta debes considerar que en algunos casos la combinación entre las tablas [dbo.maestro_prestamo] y [dbo.productos] generan mas de una fila, ¿verdad?, y puede darse en el caso que en la tabla [dbo.productos] existan valores iguales para la columna 'TIPO_PRODUCTO'. Si eso es así, entonces debes de analizar el criterio para tomar la fila del grupo.

    Para validar la existencia de duplicados puedes ejecutar la siguiente consulta:

    SELECT TIPO_PRODUCTO, COUNT(*) FROM dbo.productos 
    GROUP BY TIPO_PRODUCTO HAVING COUNT(*) > 1;



    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    miércoles, 7 de diciembre de 2016 22:52
  • La sentencia :

    SELECT TIPO_PRODUCTO, COUNT(*) FROM dbo.productos 
    GROUP BY TIPO_PRODUCTO HAVING COUNT(*) > 1;

    Me arrojo esto.

    Tipo_Producto  (No_column_name)
    1 43
    2 24
    3 19
    52 2

    Que quiere decir esto?

    (Soy nuevo en SQL, tengo menos de 2 meses.)

    jueves, 8 de diciembre de 2016 14:22
  • Nazaret Garcia,

    Significa que en la tabla [productos] se encuentran 43 filas para el TIPO_PRODUCTO 1, 24 filas para el TIPO_PRODUCTO 2, 19 filas para el TIPO_PRODUCTO 3, etc. 

    ¿Estás segur@ que no existe otra columna que identifique de manera unívoca a cada fila de la tabla 'productos'?. Al tener filas aparentemente duplicadas es de esperar que la combinación genere la misma cantidad de resultados, es decir, si la columna 'PRE.PRODUCTO' tiene el valor de 1 al combinarlo con la columna 'PRO.TIPO_PRODUCTO' resultarán 43 filas producto de la combinación, si la columna 'PRE.PRODUCTO' tiene el valor de 2 al combinarlo con la columna 'PRO.TIPO_PRODUCTO' resultarán 24 filas producto de la combinación, etc.

    En ese sentido, lo primero es analizar que columna es candidata a ser clave primaria y en caso sea la columna que mencionas analizar el porque de las filas duplicadas (de hecho por el nombre de la columna me parecería raro que contenga filas únicas, el nombre de la columna sugiere clasificación, no identificación), ¿en realidad toda la fila está duplicada?. Yo sigo pensando que estás tomando la columna equivocada (de la tabla [productos]) para definir la expresión condicional de la cláusula ON.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Propuesto como respuesta Joyce_ACModerator jueves, 8 de diciembre de 2016 16:15
    • Marcado como respuesta Nazaret Garcia jueves, 8 de diciembre de 2016 16:18
    • Desmarcado como respuesta Nazaret Garcia jueves, 8 de diciembre de 2016 16:18
    • Marcado como respuesta Nazaret Garcia jueves, 8 de diciembre de 2016 16:19
    jueves, 8 de diciembre de 2016 14:49
  • Voy a tratar con otras tablas y te escribo cualquier eventualidad, muchas gracias por clararme de dudas  Willams Morales.
    jueves, 8 de diciembre de 2016 16:20