Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

Mi consulta me da registros repetidos:

Estas en el tema de Mi consulta me da registros repetidos: en el foro de SQL Server en Foros del Web. Hola, tengo el siguiente procedimiento: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código SQL: Ver original ALTER PROCEDURE [ dbo ] . [ report ] @finicio datetime , @ffin datetime ...
  #1 (permalink)  
Antiguo 28/02/2011, 11:15
 
Fecha de Ingreso: noviembre-2007
Mensajes: 504
Antigüedad: 16 años, 5 meses
Puntos: 2
Mi consulta me da registros repetidos:

Hola, tengo el siguiente procedimiento:
Código SQL:
Ver original
  1. ALTER PROCEDURE [dbo].[report]
  2. @finicio datetime,
  3. @ffin datetime,
  4. @linea nvarchar(5),
  5. @tubo nvarchar(5),
  6. @hora nvarchar(15) AS
  7. BEGIN
  8.     SET Nocount ON
  9. SELECT o.Linea,o.Tubo,h.Marca,h.Target,p.Peso,p.Vaso,O.Codigo,p.Hora,p.Fecha
  10.     INTO #checho
  11.     FROM pesos AS p, optimas AS o,htargets AS h
  12.     WHERE o.codigo = p.codOptima AND o.linea = @linea
  13.     AND o.tubo = @tubo AND p.fecha  >=@finicio AND p.fecha<@ffin
  14.     AND h.fecha >=@finicio AND h.fecha<@ffin
  15.     AND p.hora= @hora AND h.codoptima = o.codigo AND h.hora= @hora
  16.     SELECT *,(SELECT COUNT(1)total FROM #checho) AS Totality FROM #checho ORDER BY fecha
El cual lo ejecuto de esta manera:
Código SQL:
Ver original
  1. EXEC report '20110216','20110217','L17S','D','0:00 - 0:30'
Pero me da MUCHOS datos repetidos, entonces el numero total de registros que me retorna es muy grande.
Entonces cree una consulta con casi las mismas condiciones para probar si la aplicacion esta guardando los datos repetidos pero no es asi, puesto la consulta es esta:
Código SQL:
Ver original
  1. SELECT * FROM PESOS WHERE codoptima=97
  2. AND fecha >='20110216'
  3. AND fecha <'20110217' AND hora='0:00 - 0:30'
  4. ORDER BY fecha
Y me retorna un numero diferente de registros y los registros no estan repetidos:
Dejo captura de pantalla:
http://ompldr.org/vN2xtdw
  #2 (permalink)  
Antiguo 28/02/2011, 12:19
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Mi consulta me da registros repetidos:

Hola th3r0rn:

Seguramente te falta definir alguna relación entre tus tablas, de tal manera que se está realizando un producto cartesiano. De hecho el la imagen que pones la columna VASO tiene valores diferentes, creo que ahí está el problema. haz un select * para que revises sobre qué tabla se está realizando el producto.

Y otra cosa. muchas veces hemos insistido en la utilización de la cláusula JOIN (INNER, LEFT, RIGHT según sea el caso) en lugar de hacer las uniones en el WHERE... haz la prueba y verás una enorme diferencia en el performance de la consulta:

Código:
--Utilizando JOIN

select * from Tabla1 INNER JOIN tabla2 on Tabla1.id = Tabla2.id

--Sin utilizar JOIN

select * from Tabla1, Tabla2 where Tabla1.id = Tabla2.id
Saludos
Leo
  #3 (permalink)  
Antiguo 28/02/2011, 12:49
 
Fecha de Ingreso: noviembre-2007
Mensajes: 504
Antigüedad: 16 años, 5 meses
Puntos: 2
Respuesta: Mi consulta me da registros repetidos:

Hola Leo,
No entiendo a que te refieras a hacer un selec * para revisar sobre que tabla se esta realizando el producto. Pdrias darme mas detalles de esto? puesto que no entiendo a que te refieras.
Gracias y saludos
  #4 (permalink)  
Antiguo 01/03/2011, 08:04
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Mi consulta me da registros repetidos:

Hola th3r0rn:

En tu select estás tomando sólo algunos de los campos de tus tablas, pero me imagino que además de estos tienes algunos más. Al no mostrar todos los campos que intervienen en tu tabla puede resultar complicado determinar si te falta declara alguna relación entre tus tablas. Te pongo un ejemplo para ver si se entiende:

Código SQL:
Ver original
  1. DECLARE @Tabla1 TABLE (id1 INT, id2 INT, descripcion VARCHAR(50))
  2. INSERT INTO @Tabla1 VALUES(1, 1, 'uno')
  3. INSERT INTO @Tabla1 VALUES(2, 2, 'dos')
  4. INSERT INTO @Tabla1 VALUES(3, 3, 'tres')
  5.  
  6. DECLARE @Tabla2 TABLE (id1 INT, id2 INT, descripcion VARCHAR(50))
  7. INSERT INTO @Tabla2 VALUES(1, 1, 'UNO-UNO')
  8. INSERT INTO @Tabla2 VALUES(1, 2, 'UNO-DOS')
  9. INSERT INTO @Tabla2 VALUES(1, 3, 'UNO-TRES')
  10. INSERT INTO @Tabla2 VALUES(2, 1, 'DOS-UNO')
  11. INSERT INTO @Tabla2 VALUES(2, 2, 'DOS-DOS')
  12. INSERT INTO @Tabla2 VALUES(2, 3, 'DOS-TRES')
  13. INSERT INTO @Tabla2 VALUES(3, 1, 'TRES-UNO')
  14. INSERT INTO @Tabla2 VALUES(3, 3, 'TRES-TRES')
  15.  
  16. SELECT T1.id1, T1.id2, T1.descripcion FROM @Tabla1 T1
  17. INNER JOIN @Tabla2 T2 ON T1.id1 = T2.id1

Si ejecutas este script te regresa lo siguiente:
Código:
id1|id|descripcion|descripcion
---------------------------------------
1|1|uno
1|1|uno
1|1|uno
2|2|dos
2|2|dos
2|2|dos
3|3|tres
3|3|tres
Si observas aquí se están repitiendo los registros, pero como hice sólo un select sobre los campos de la primer tabla no puedo determinar donde está el error. En estos casos es conveniente que hagas un select *, para obtener la información de todas las tablas que se involucran en la consulta:

Código SQL:
Ver original
  1. SELECT * FROM @Tabla1 T1
  2. INNER JOIN @Tabla2 T2 ON T1.id1 = T2.id1

Con esto obtienes lo siguiente:

Código:
id1|id2|descripcion|id1|id2|descripcion
----------------------------------------------------
1|1|uno|1|1|UNO-UNO
1|1|uno|1|2|UNO-DOS
1|1|uno|1|3|UNO-TRES
2|2|dos|2|1|DOS-UNO
2|2|dos|2|2|DOS-DOS
2|2|dos|2|3|DOS-TRES
3|3|tres|3|1|TRES-UNO
3|3|tres|3|3|TRES-TRES
Creo que con esto es más claro que NO ES QUE SE REPITAN LOS REGISTROS, sino que CADA REGISTRO ES ÚNICO, pero al no declararse la relación con el campo id2 de las tablas se está realizando un producto cartesiano.

De tal manera que la consulta correcta debería ser así:

Código SQL:
Ver original
  1. SELECT * FROM @Tabla1 T1
  2. INNER JOIN @Tabla2 T2 ON T1.id1 = T2.id1 AND T1.id2 = T2.id2

Código:
id1|id2|descripcion|id1|id2|descripcion
----------------------------------------------------
1	1	uno	1	1	UNO-UNO
2	2	dos	2	2	DOS-DOS
3	3	tres	3	3	TRES-TRES
Espero que se entienda más o menos el problema y ojalá que te sea de ayuda

Saludos
Leo.
  #5 (permalink)  
Antiguo 01/03/2011, 11:59
 
Fecha de Ingreso: noviembre-2007
Mensajes: 504
Antigüedad: 16 años, 5 meses
Puntos: 2
Respuesta: Mi consulta me da registros repetidos:

Leo,
Quiero hacer el join pero me da muchos errores:
Código SQL:
Ver original
  1. CREATE PROCEDURE [dbo].[reportes]
  2. @finicio datetime,
  3. @ffin datetime,
  4. @linea nvarchar(5),
  5. @tubo nvarchar(5),
  6. @hora nvarchar(15) AS
  7. BEGIN
  8.     SET Nocount ON
  9. SELECT optimas.Linea,optimas.Tubo,htargets.Marca,htargets.Target,pesos.Peso,pesos.Vaso,Optimas.Codigo,pesos.Hora,pesos.Fecha
  10.     INTO #checho
  11.     FROM pesos INNER JOIN optimas ON optimas.codigo=pesos.codoptima
  12.     WHERE optimas.codigo = pesos.codOptima AND optimas.linea = @linea
  13.     AND optimas.tubo = @tubo AND pesos.fecha  >=@finicio AND pesos.fecha<@ffin
  14.     AND htargets.fecha >=@finicio AND htargets.fecha<@ffin
  15.     AND pesos.hora = @hora AND h.codoptima = optimas.codigo AND htargets.hora= @hora
  16.     SELECT *,(SELECT COUNT(1)total FROM #checho) AS Totality FROM #checho ORDER BY fecha
  17.  
  18. END
Te dejo una captura de pantalla a continuacion:
http://ompldr.org/vN202YQ
  #6 (permalink)  
Antiguo 01/03/2011, 13:17
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Respuesta: Mi consulta me da registros repetidos:

th3r0n

(con el permis)

Los mensaje de error son bien claros, hay algunos objetos (vistas o tablas) que no se reconocen en tu SELECT, por ejemplo: htargets
__________________
MCTS Isaias Islas
  #7 (permalink)  
Antiguo 01/03/2011, 13:39
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Mi consulta me da registros repetidos:

Tal como lo comenta el compañero iislas el error es claro, ya que no estás especificando en ningún lado la tabla htargets ni en el FROM ni en el INNER JOIN, sólo estás manejando las tablas pesos (en el from) y optimas (en el join)

Te recomiendo que leas cualquier manual de fundamentos de SQL para saber la sintáxis de los JOINS o pregúntale a Santa Wikipedia o a San Google, te aseguro que ellos pueden tener la respuesta.

para unir tres o más tablas la sintaxis es más o menos la siguiente (Solo pongo la parte del FROM-JOIN)

FROM Tabla1
INNER JOIN Tabla2 ON Tabla1.campo = Tabla2.campo
INNER JOIN Tabla3 ON Tabla1.campo = Tabla3.campo
***
***
INNER JOIN Tablan ON Tabla1.campo = Tablan.campo

es decir UN INNER JOIN POR CADA TABLA QUE ESTÉ INVOLUCRADA...

Saludos
Leo.
  #8 (permalink)  
Antiguo 02/03/2011, 09:14
 
Fecha de Ingreso: noviembre-2007
Mensajes: 504
Antigüedad: 16 años, 5 meses
Puntos: 2
Respuesta: Mi consulta me da registros repetidos:

Hola, perdon
ya lo he puesto bien, pero aun asi sigue repitiendome los registros :(
Código SQL:
Ver original
  1. USE [wasp]
  2. GO
  3. /****** Object:  StoredProcedure [dbo].[report]    Script Date: 02/28/2011 11:05:53 ******/
  4. SET ANSI_NULLS ON
  5. GO
  6. SET QUOTED_IDENTIFIER ON
  7. GO
  8.  
  9.  
  10.  
  11. ALTER PROCEDURE [dbo].[reportes]
  12. @finicio datetime,
  13. @ffin datetime,
  14. @linea nvarchar(5),
  15. @tubo nvarchar(5),
  16. @hora nvarchar(15) AS
  17. BEGIN
  18.     SET Nocount ON
  19. SELECT optimas.Linea,optimas.Tubo,htargets.Marca,htargets.Target,pesos.Peso,pesos.Vaso,Optimas.Codigo,pesos.Hora,pesos.Fecha
  20.     INTO #checho
  21.     FROM pesos INNER JOIN optimas ON optimas.codigo=pesos.codoptima
  22.     INNER JOIN htargets ON pesos.codoptima = htargets.codoptima
  23.     WHERE  optimas.linea = @linea
  24.     AND optimas.tubo = @tubo AND pesos.fecha  >=@finicio AND pesos.fecha<@ffin
  25.     AND htargets.fecha >=@finicio AND htargets.fecha<@ffin
  26.     AND pesos.hora = @hora AND htargets.codoptima = optimas.codigo AND htargets.hora= @hora
  27.     SELECT *,(SELECT COUNT(1)total FROM #checho) AS Totality FROM #checho ORDER BY fecha
  28.  
  29. END
  #9 (permalink)  
Antiguo 02/03/2011, 11:12
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Mi consulta me da registros repetidos:

Compañer@ th3r0rn:

Creo que no haz terminado por entender donde está el error, si revisas el primer post que puse te hago el siguiente comentario

Cita:
te falta definir alguna relación entre tus tablas, de tal manera que se está realizando un producto cartesiano
En la consulta que pusiste NO VEO NINGUNA RELACIÓN ADICIONAL, es decir, lo único que hiciste es hacer las uniones con JOIN, pero dejaste exactamente las mismas condiciones.

¿Qué relación falta? pues eso debes contestarlo tú. Si es una relación física (es decir que exista en la definición de las tablas) puedes utilizar el Managment Studio para revisar cada una de las tablas que estás utilizando y las relaciones que tiene definida. Si es una relación lógica (es decir que no tengas definida en la bd la FK) puedes MEDIANTE OBSERVACIÓN DE TUS DATOS determinar qué campo o campos son los que tienen problemas.

Revisa si alguna de las tablas tiene LLAVES COMPUESTAS, si es así debes incluir todos los campos que integran esta llave al hacer la unión. Estás manejando Fechas, pero no veo que relaciones este campo, también este punto.

Finalmente, para este tipo de problemas difícilmente encontrarás una solución en los foros, es decir te podemos dar pistas, algunos trucos etc. pero tú tienes que encontrar la solución.

Saludos y buena suerte
Leo.

Saludos
Leo.
  #10 (permalink)  
Antiguo 07/03/2011, 12:41
 
Fecha de Ingreso: noviembre-2007
Mensajes: 504
Antigüedad: 16 años, 5 meses
Puntos: 2
Respuesta: Mi consulta me da registros repetidos:

Hola, no tengo llaves primarias, esto podria ser el problema?
  #11 (permalink)  
Antiguo 08/03/2011, 08:31
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Mi consulta me da registros repetidos:

El no tener llaves es un problema desde el punto de vista de diseño de bd, pero no tiene que ver con la duplicidad de los registros. Si observas el ejemplo que puse al crear las tablas en ninguna de ellas estoy definiendo llaves primarias ni foráneas, pero al colocar TODAS LAS RELACIONES LÓGICAS existentes entre los datos entonces no hay problama.

De pura casualidad ya probaste los puntos que te comenté anteriormente??? sobre todo en el punto referente a las fechas???

Saludos
Leo.
  #12 (permalink)  
Antiguo 08/03/2011, 08:52
 
Fecha de Ingreso: noviembre-2007
Mensajes: 504
Antigüedad: 16 años, 5 meses
Puntos: 2
Respuesta: Mi consulta me da registros repetidos:

Leo, las fechas no puedo empatarlas con ningun otro campo por eso no hago una union, ya revise los campos y no encuentro donde pueda estar el problema. Por favor dame nuevas alternmativas a esto
Porcierto que ves de malo en mi consulta: http://ompldr.org/vN3B5eQ
Código SQL:
Ver original
  1. USE [wasp]
  2. GO
  3. /****** Object:  StoredProcedure [dbo].[reportes]    Script Date: 03/08/2011 08:48:12 ******/
  4. SET ANSI_NULLS ON
  5. GO
  6. SET QUOTED_IDENTIFIER ON
  7. GO
  8.  
  9.  
  10.  
  11. ALTER PROCEDURE [dbo].[reportes]
  12. @finicio datetime,
  13. @ffin datetime,
  14. @linea nvarchar(5),
  15. @tubo nvarchar(5),
  16. @hora nvarchar(15) AS
  17. BEGIN
  18.     SET Nocount ON
  19. SELECT optimas.Linea,optimas.Tubo,htargets.Marca,htargets.Target,pesos.Peso,pesos.Vaso,Optimas.Codigo,pesos.Hora,pesos.Fecha
  20. --  INTO #checho
  21.     FROM pesos INNER JOIN optimas ON optimas.codigo=pesos.codoptima
  22.     INNER JOIN htargets ON pesos.codoptima = htargets.codoptima
  23.     INNER JOIN pesos ON pesos.hora = htargets.hora
  24.         WHERE  optimas.linea = @linea
  25.     AND optimas.tubo = @tubo AND pesos.fecha  >=@finicio AND pesos.fecha<@ffin
  26.     AND htargets.fecha >=@finicio AND htargets.fecha<@ffin
  27.     AND pesos.hora = @hora AND htargets.codoptima = optimas.codigo AND htargets.hora= @hora
  28.   -- SELECT *,(SELECT count(1)total FROM #checho) as Totality from #checho order by fecha
  29.  
  30. END

Última edición por th3r0rn; 08/03/2011 a las 12:52

Etiquetas: registros, repetidos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:00.