Ver Mensaje Individual
  #4 (permalink)  
Antiguo 01/03/2011, 08:04
leonardo_josue
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 4 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.