none
Se duplican los resultados de Consulta SQL RRS feed

  • Pregunta

  • Tengo un proyecto que trata de un sistema de marcaje pero tengo un problema con mi base de datos...

    Utilizo un left join para unir tres tablas, cuando tengo un solo registro y ejecuto la consulta todo se hace bien no hay problema con nada pero al momento de tener mas registros, al ejecutar la consulta todos estos registros se duplican.

    Alguien podria ayudarme con esto... Dejo el script de toda la base de datos junto con la consulta para que me puedan corregir y ayudarme a componerla 

    Por favor... Ayudaa...

    Estas son las tablas:

    create table emple(ID bigint primary key not null, Nombre varchar(100), Departamento varchar(50))
    
    go
    create table marcaje_Entrada(ID_Empleado bigint, Nombre varchar(100), Departamento varchar(50),
    Fecha datetime default getdate(),Comentario varchar(max),
    constraint fk_ID_d foreign key (ID_Empleado) references emple(ID))
    
    go
    create table marcaje_Salida(ID_Empleado bigint, Nombre varchar(100), Departamento varchar(50),
    Fecha datetime default getdate(),Comentario varchar(max), 
    constraint fk_ID foreign key (ID_Empleado) references emple(ID))

    Y aqui dejo la consulta;

    create procedure ff
    	@codigo bigint,
    	@fechaIni date,
    	@fechaFin date
    as
    begin
    	select e.ID, e.Nombre, e.Departamento, me.Fecha, ms.Fecha from marcaje_Entrada as me 
    	LEFT join emple as e on me.ID_Empleado = e.ID
    	left join marcaje_Salida as ms on ms.ID_Empleado = e.ID
    	where e.ID = @codigo and me.Fecha BETWEEN @fechaIni AND @fechaFin
    end

    Agradeceria su ayuda....


    miércoles, 22 de noviembre de 2017 2:22

Respuestas

  • Utilizo un left join [...] tener mas registros, al ejecutar la consulta todos estos registros se duplican.

    Esa es precisamente una característica del JOIN (sea LEFT o no): te devuelve TODAS las posibles combinaciones de registros que satisfagan las condiciones de la consulta. Esto implica que si un registro de una tabla puede unirse a dos registros de otra tabla, el primero se obtiene dos veces. Cuantas más tablas tengas (en tu caso son tres), más duplicidades se producen, porque se obtienen todas las posibles combinaciones de todas las tablas.

    El remedio está en la parte que dices "... todos los que satisfagan las condiciones...". Si te salen más resultados de los que querías, significa que no has sido suficientemente restrictivo en las condiciones que has puesto. Tienes que decidir cuál es el criterio para escoger la combinación válida cuando los registros de las tablas pueden combinarse de varias maneras, y luego añadir ese criterio en el WHERE o el ON de la consulta.

    miércoles, 22 de noviembre de 2017 7:40

Todas las respuestas

  • Utilizo un left join [...] tener mas registros, al ejecutar la consulta todos estos registros se duplican.

    Esa es precisamente una característica del JOIN (sea LEFT o no): te devuelve TODAS las posibles combinaciones de registros que satisfagan las condiciones de la consulta. Esto implica que si un registro de una tabla puede unirse a dos registros de otra tabla, el primero se obtiene dos veces. Cuantas más tablas tengas (en tu caso son tres), más duplicidades se producen, porque se obtienen todas las posibles combinaciones de todas las tablas.

    El remedio está en la parte que dices "... todos los que satisfagan las condiciones...". Si te salen más resultados de los que querías, significa que no has sido suficientemente restrictivo en las condiciones que has puesto. Tienes que decidir cuál es el criterio para escoger la combinación válida cuando los registros de las tablas pueden combinarse de varias maneras, y luego añadir ese criterio en el WHERE o el ON de la consulta.

    miércoles, 22 de noviembre de 2017 7:40
  • Como podría ser mas restrictivo con los criterios que propongo?

    Diego

    jueves, 23 de noviembre de 2017 1:09
  • Bueno, ¿cuál es el criterio para decidir qué registros quieres? Es decir, si por ejemplo tienes un Join de la tabla de Empleados con la de marcajes de salida, pues entonces si un empleado tiene varios marcajes de salida, el empleado se te repite en todos los registros, tantas veces como marcajes de salida tenga. Si no quieres que se repita, tienes que tomar una decisión en cuanto a cómo decides cuál de todos esos registros quieres sacar, y añadir en el "where" una condición que represente ese criterio. Mientras no digas cuál es ese criterio, no se puede determinar cómo se escribiría en SQL la condición que lo expresa.
    jueves, 23 de noviembre de 2017 7:34
  • Hola DIEGO MARROQUIN

    Con base a tu consulta, te recomiendo  implementar el siguiente ejemplo de código, que impide la duplicidad de datos. Espero que te sea de mucha utilidad

    La palabra clave DISTINCT elimina las filas duplicadas de los resultados de una instrucción SELECT. Si no se especifica DISTINCT, se devuelven todas las filas, incluidas las duplicadas. Por ejemplo, si selecciona todos los Id. de producto de ProductInventory sin DISTINCT, se devolverán 1069 filas.

    Con DISTINCT, puede eliminar los duplicados y ver sólo los Id. de producto que sean únicos.

    Copiar            

    USE AdventureWorks2008R2; GO SELECT DISTINCT ProductID FROM Production.ProductInventory ;

    -------------------------------------------------------------

    Quedamos al pendiente de cualquier actualización de tu parte

    Saludos Cordiales

    Gracias por usar los foros de MSDN.

    Pablo Rubio
    _____
     
    Por favor recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema, es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.
     
    Microsoft ofrece este servicio de forma gratuita, con la finalidad de ayudar a los usuarios y la ampliación de la base de datos de conocimientos relacionados con los productos y tecnologías de Microsoft.
     
    Este contenido es proporcionado "tal cual" y no implica ninguna responsabilidad de parte de Microsoft.

    jueves, 23 de noviembre de 2017 18:54
    Moderador
  • Hola Pablo Rubio

    Veras ya utilice el DISTINCT y me sigue duplicando los datos que tengo y no se porque, cuando tengo dod datos registrados al hacer la consulta me salen 4 datos y asi salen siempre dependiendo de la cantidad de datos que tenga.


    Diego


    viernes, 24 de noviembre de 2017 19:18