none
Ayuda con registros repetidos RRS feed

  • Pregunta

  • Al hacer la siguiente consulta SQL me aparecen en los resultados registros duplicados. Que ha fallado en mi consulta ? o que cosa debo cambiar...

    
    

    select IDConcepto,[dbo].[tblDocuVentaDetalle].IDDocuVenta,Monto,OPP.tblConcepto.tipoConcep,OPP.tblSolicitud.idTiSoli 
    from [dbo].[tblDocuVentaDetalle] inner join OPP.tblConcepto 
    on [dbo].[tblDocuVentaDetalle].IDConcepto=OPP.tblConcepto.IDConcep inner join OPP.tblSolicitud 
    on OPP.tblSolicitud.idAlum =[dbo].[tblDocuVentaDetalle].IDAlumno 
    where IDAlumno='2008205441' AND IDConcepto IN (select IDConcep FROM OPP.tblConcepto) AND FechaCreacion >= '31/10/2014' 
    order by FechaCreacion desc 

    miércoles, 8 de julio de 2015 22:26

Respuestas

  • Hola, cuando generes un query cuida la identación, el orden como se visualiza, de esta manera es más fácil de leerlo y darle mantenimiento, además agrega siempre alias a las tablas que uses,

    --Ejm:
    
    Select t.campo1, t.campo from Tabla t

    Cambie tu query, en la parte que hacías un IN a todos tus conceptos, el operador IN es como el operador OR a varios campos y por lo visto al hacerlo así es como si usarías un subquery y no lo estas amarrando a la Tabla concepto que invocas más arriba, prueba de esta manera y cuéntanos.

    select 
    	IDConcepto,dvd.IDDocuVenta,Monto,tc.tipoConcep,ts.idTiSoli 
    from 
    	[dbo].[tblDocuVentaDetalle] dvd inner join OPP.tblConcepto tc on
    	dvd.IDConcepto=tc.IDConcep 
    inner join OPP.tblSolicitud ts on
    	ts.idAlum =dvd.IDAlumno 
    where 
    	IDAlumno='2008205441' AND IDConcepto = tc.IDConcep AND FechaCreacion >= '31/10/2014' 
    order by 
    	FechaCreacion desc 

    PD: Agrega los alias a las columnas que nos las tienen.

    Saludos!


    Ayacucho - Perú
    Recuerda si mi solución atiende tu consulta por favor márcala como útil y como respuesta.

    http://litigiouslobo.blogspot.com/
    El Blog de Herbert Mendoza

    • Editado Nathán XS miércoles, 8 de julio de 2015 22:46
    • Marcado como respuesta fredsale jueves, 9 de julio de 2015 21:25
    miércoles, 8 de julio de 2015 22:42
  • Es muy difícil sin tener tus datos saber por que viene tu duplicado. no creo que el in esté en el fondo de la cuestión .

    Los pasos que yo haría para detectar el duplicado son, partiendo de tu query algo más ordenada para entenderla que es

    select IDConcepto,[dbo].[tblDocuVentaDetalle].IDDocuVenta,
    		Monto,OPP.tblConcepto.tipoConcep,
    		OPP.tblSolicitud.idTiSoli 
    from [dbo].[tblDocuVentaDetalle] 
    			inner join OPP.tblConcepto 
    					on [dbo].[tblDocuVentaDetalle].IDConcepto=OPP.tblConcepto.IDConcep 
    			inner join OPP.tblSolicitud 
    					on OPP.tblSolicitud.idAlum =[dbo].[tblDocuVentaDetalle].IDAlumno 
    where IDAlumno='2008205441'
     AND IDConcepto IN (select IDConcep FROM OPP.tblConcepto) AND FechaCreacion >= '31/10/2014' 
    order by FechaCreacion desc 

    la cambiaría momentáneamente por

    select * 
    from [dbo].[tblDocuVentaDetalle] 
    			inner join OPP.tblConcepto 
    					on [dbo].[tblDocuVentaDetalle].IDConcepto=OPP.tblConcepto.IDConcep 
    			inner join OPP.tblSolicitud 
    					on OPP.tblSolicitud.idAlum =[dbo].[tblDocuVentaDetalle].IDAlumno 
    where IDAlumno='2008205441'
     AND IDConcepto IN (select IDConcep FROM OPP.tblConcepto) AND FechaCreacion >= '31/10/2014' 

    esto te va a mostrar toda la tabla, y verás en cual de ellas está provocando el duplicado. Tu que entiendes como están organizadas podrás decidir como evitarlo, si no lo logras o si una vez que lo ves, crees que está todo correcto y que los duplicados son normales pero no los quieres, cambia tu query por

    select DISTINCT IDConcepto,[dbo].[tblDocuVentaDetalle].IDDocuVenta,
    		Monto,OPP.tblConcepto.tipoConcep,
    		OPP.tblSolicitud.idTiSoli 
    from [dbo].[tblDocuVentaDetalle] 
    			inner join OPP.tblConcepto 
    					on [dbo].[tblDocuVentaDetalle].IDConcepto=OPP.tblConcepto.IDConcep 
    			inner join OPP.tblSolicitud 
    					on OPP.tblSolicitud.idAlum =[dbo].[tblDocuVentaDetalle].IDAlumno 
    where IDAlumno='2008205441'
     AND IDConcepto IN (select IDConcep FROM OPP.tblConcepto) AND FechaCreacion >= '31/10/2014' 
    order by FechaCreacion desc 


    Comparte lo que sepas, aprende lo que no sepas (FGG)
    portalSQL
    El rincón del DBA

    • Marcado como respuesta fredsale jueves, 9 de julio de 2015 21:25
    jueves, 9 de julio de 2015 8:05
    Moderador

Todas las respuestas

  • Hola, cuando generes un query cuida la identación, el orden como se visualiza, de esta manera es más fácil de leerlo y darle mantenimiento, además agrega siempre alias a las tablas que uses,

    --Ejm:
    
    Select t.campo1, t.campo from Tabla t

    Cambie tu query, en la parte que hacías un IN a todos tus conceptos, el operador IN es como el operador OR a varios campos y por lo visto al hacerlo así es como si usarías un subquery y no lo estas amarrando a la Tabla concepto que invocas más arriba, prueba de esta manera y cuéntanos.

    select 
    	IDConcepto,dvd.IDDocuVenta,Monto,tc.tipoConcep,ts.idTiSoli 
    from 
    	[dbo].[tblDocuVentaDetalle] dvd inner join OPP.tblConcepto tc on
    	dvd.IDConcepto=tc.IDConcep 
    inner join OPP.tblSolicitud ts on
    	ts.idAlum =dvd.IDAlumno 
    where 
    	IDAlumno='2008205441' AND IDConcepto = tc.IDConcep AND FechaCreacion >= '31/10/2014' 
    order by 
    	FechaCreacion desc 

    PD: Agrega los alias a las columnas que nos las tienen.

    Saludos!


    Ayacucho - Perú
    Recuerda si mi solución atiende tu consulta por favor márcala como útil y como respuesta.

    http://litigiouslobo.blogspot.com/
    El Blog de Herbert Mendoza

    • Editado Nathán XS miércoles, 8 de julio de 2015 22:46
    • Marcado como respuesta fredsale jueves, 9 de julio de 2015 21:25
    miércoles, 8 de julio de 2015 22:42
  • Es muy difícil sin tener tus datos saber por que viene tu duplicado. no creo que el in esté en el fondo de la cuestión .

    Los pasos que yo haría para detectar el duplicado son, partiendo de tu query algo más ordenada para entenderla que es

    select IDConcepto,[dbo].[tblDocuVentaDetalle].IDDocuVenta,
    		Monto,OPP.tblConcepto.tipoConcep,
    		OPP.tblSolicitud.idTiSoli 
    from [dbo].[tblDocuVentaDetalle] 
    			inner join OPP.tblConcepto 
    					on [dbo].[tblDocuVentaDetalle].IDConcepto=OPP.tblConcepto.IDConcep 
    			inner join OPP.tblSolicitud 
    					on OPP.tblSolicitud.idAlum =[dbo].[tblDocuVentaDetalle].IDAlumno 
    where IDAlumno='2008205441'
     AND IDConcepto IN (select IDConcep FROM OPP.tblConcepto) AND FechaCreacion >= '31/10/2014' 
    order by FechaCreacion desc 

    la cambiaría momentáneamente por

    select * 
    from [dbo].[tblDocuVentaDetalle] 
    			inner join OPP.tblConcepto 
    					on [dbo].[tblDocuVentaDetalle].IDConcepto=OPP.tblConcepto.IDConcep 
    			inner join OPP.tblSolicitud 
    					on OPP.tblSolicitud.idAlum =[dbo].[tblDocuVentaDetalle].IDAlumno 
    where IDAlumno='2008205441'
     AND IDConcepto IN (select IDConcep FROM OPP.tblConcepto) AND FechaCreacion >= '31/10/2014' 

    esto te va a mostrar toda la tabla, y verás en cual de ellas está provocando el duplicado. Tu que entiendes como están organizadas podrás decidir como evitarlo, si no lo logras o si una vez que lo ves, crees que está todo correcto y que los duplicados son normales pero no los quieres, cambia tu query por

    select DISTINCT IDConcepto,[dbo].[tblDocuVentaDetalle].IDDocuVenta,
    		Monto,OPP.tblConcepto.tipoConcep,
    		OPP.tblSolicitud.idTiSoli 
    from [dbo].[tblDocuVentaDetalle] 
    			inner join OPP.tblConcepto 
    					on [dbo].[tblDocuVentaDetalle].IDConcepto=OPP.tblConcepto.IDConcep 
    			inner join OPP.tblSolicitud 
    					on OPP.tblSolicitud.idAlum =[dbo].[tblDocuVentaDetalle].IDAlumno 
    where IDAlumno='2008205441'
     AND IDConcepto IN (select IDConcep FROM OPP.tblConcepto) AND FechaCreacion >= '31/10/2014' 
    order by FechaCreacion desc 


    Comparte lo que sepas, aprende lo que no sepas (FGG)
    portalSQL
    El rincón del DBA

    • Marcado como respuesta fredsale jueves, 9 de julio de 2015 21:25
    jueves, 9 de julio de 2015 8:05
    Moderador
  • Pon de la siguiente manera:

    select DISTINCT IDConcepto,[dbo].[tblDocuVentaDetalle].IDDocuVenta,Monto,OPP.tblConcepto.tipoConcep,OPP.tblSolicitud.idTiSoli 
    from [dbo].[tblDocuVentaDetalle] inner join OPP.tblConcepto 
    on [dbo].[tblDocuVentaDetalle].IDConcepto=OPP.tblConcepto.IDConcep inner join OPP.tblSolicitud 
    on OPP.tblSolicitud.idAlum =[dbo].[tblDocuVentaDetalle].IDAlumno 
    where IDAlumno='2008205441' AND IDConcepto IN (select IDConcep FROM OPP.tblConcepto) AND FechaCreacion >= '31/10/2014' 
    order by FechaCreacion desc 


    Si mi respuesta fue útil ayudame marcándola como correcta.

    • Propuesto como respuesta PIO DEVELOPER jueves, 9 de julio de 2015 19:50
    jueves, 9 de julio de 2015 18:15
  • Hola

    Parece que te está faltando unir las tablas con una llave más, pero al no conocer la estructura de tus tablas es difícil estar seguro. Aún así revisa quizás alguna de las tablas que unes necesita de unirse con una columna adicional


    Si se solucionó tu consulta no olvides marcar la respuesta de esta forma mantendremos el orden en el Foro.

    José Carlos Barba Gutierrez
    Lima - Perú
    Saludos

    jueves, 9 de julio de 2015 19:40
  • Cuando ejecuto tu query me sale este mensaje de error, referente al order by


    jueves, 9 de julio de 2015 21:27