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

Comparar información.

Estas en el tema de Comparar información. en el foro de SQL Server en Foros del Web. Hola a todos, tengo la siguiente pregunta para ustedes: Tengo dos tablas con la misma estructura: Campo 1 Campo 2 Campo 3 Campo 4 Campo ...
  #1 (permalink)  
Antiguo 21/02/2006, 09:18
Avatar de Cuezaltzin  
Fecha de Ingreso: diciembre-2003
Ubicación: Frente al Monitor
Mensajes: 252
Antigüedad: 20 años, 5 meses
Puntos: 0
Exclamación Comparar información.

Hola a todos, tengo la siguiente pregunta para ustedes:

Tengo dos tablas con la misma estructura:
Campo 1
Campo 2
Campo 3
Campo 4
Campo 5

Bien lo que estoy intentando hacer es comparar los datos de las dos tablas pero cumpliendo las siguientes condiciones:

1.- Que campo 1, campo2 y campo 3 tengan los datos iguales.
2.- Que en los campos 4 y campo 5 sean diferentes.

Hasta ahorita lo que tengo es :

SELECT *
FROM Tabla1 LEFT JOIN Tabla 2 ON Tabla1.Campo 4 = tabla2.Campo 4 AND Tabla1.Campo 5 = Tabla2.Campo 5

Espero haberme explicado lo suficiente
__________________
Hasta la victoria Siempre.
  #2 (permalink)  
Antiguo 22/02/2006, 12:49
Avatar de Cuezaltzin  
Fecha de Ingreso: diciembre-2003
Ubicación: Frente al Monitor
Mensajes: 252
Antigüedad: 20 años, 5 meses
Puntos: 0
Alguien que me pueda dar una pista de como hacer esto.
Por favor.
__________________
Hasta la victoria Siempre.
  #3 (permalink)  
Antiguo 22/02/2006, 12:57
 
Fecha de Ingreso: noviembre-2005
Mensajes: 658
Antigüedad: 18 años, 6 meses
Puntos: 3
No esta claro para nada... por un lado necesitas que del campo1 al 3 sean iguales y que los campos 4 y 5 distintos y en tu query lo unico que haces es sacar los que tienen solo los campos4 y 5 iguales¿¿??...
La salida quieres que sea
tabla1.campo1,tabla1.campo2,tabla1.campo3,tabla1.c ampo4,tabla2.campo4,tabla1.campo5,tabla2.campo5 o no?... eso es lo que al parecer necesitas.... aclara esto para ayudarte
  #4 (permalink)  
Antiguo 22/02/2006, 14:58
Avatar de Cuezaltzin  
Fecha de Ingreso: diciembre-2003
Ubicación: Frente al Monitor
Mensajes: 252
Antigüedad: 20 años, 5 meses
Puntos: 0
Ok, tratare de explicar esto mejor.

Tengo dos tablas las cuales tienen la misma estructura, pero que contienen información diferente y los que esto intentando es comparar estas dos tablas, tomando como llave campo1,campo2 y campo3.

Tengo los siguiente registros:

Campo1--Campo2--Campo3--Campo4--Campo5

Tabla 1
M--2222--AAAA--01--01
M--2222--AAAA--02--02

Tabla 2
M--2222--AAAA--01--01
M--2222--AAAA--02--03

Y quieroque mi consulta me regrese los siguientes registros:
Tabla1 : M--2222--AAAA--02--02
Tabla2 : M--2222--AAAA--02--03

Ya que estos registros son identicos en los campos llaves pero tienen una diferencia en el campo5.

Espero haberme explicado lo suficiente, y gracias por la ayuda. Saludos.
__________________
Hasta la victoria Siempre.
  #5 (permalink)  
Antiguo 24/02/2006, 14:47
Avatar de Cuezaltzin  
Fecha de Ingreso: diciembre-2003
Ubicación: Frente al Monitor
Mensajes: 252
Antigüedad: 20 años, 5 meses
Puntos: 0
Alguna sugerencia, para resolver esto que se me esta complicando.

Saludos.
__________________
Hasta la victoria Siempre.
  #6 (permalink)  
Antiguo 24/02/2006, 16:38
Avatar de Mithrandir
Colaborador
 
Fecha de Ingreso: abril-2003
Mensajes: 12.106
Antigüedad: 21 años
Puntos: 25
Prueba algo como esto:
Código:
SELECT * --todos los que existen en t1 y no en t2
FROM tabla1 t1
	LEFT OUTER JOIN tabla2 t2
ON t1.campo1 = t2.campo1
	AND t1.campo2 = t2.campo2
	AND t1.campo3 = t2.campo3
	AND t2.campo4 IS NULL
UNION ALL
SELECT * --todos los que existen en t2 y no en t1
FROM tabla1 t1
	RIGHT OUTER JOIN tabla2 t2
ON t1.campo1 = t2.campo1
	AND t1.campo2 = t2.campo2
	AND t1.campo3 = t2.campo3
	AND t1.campo4 IS NULL
__________________
"El hombre, en su orgullo, creó a Dios a su imagen y semejanza."
Friedrich Nietzsche
  #7 (permalink)  
Antiguo 28/02/2006, 15:57
Avatar de Cuezaltzin  
Fecha de Ingreso: diciembre-2003
Ubicación: Frente al Monitor
Mensajes: 252
Antigüedad: 20 años, 5 meses
Puntos: 0
No pues sigo sin poder hacer esto.

Voy a poner otro ejemplo para ver si alguien me puede ayudar a desifrar este problemilla:

Tengo estos tres registro por tabla con la siguiente información en los 5 campos:

Tabla1
M--2222--AAAA--01
N--3333--BBBBB--02
P--4445--CCCC--03

Tabla2
M--2222-AAAA--01
N--3333--BBBB--04
P--4444-CCC4--03

Pues bien lo que estoy intentando es obtener los registro que contengan la misma llave en el campo1,campo2 y campo3 y que en el cmapo 4 tenga una diferencia y lo que espero de resultado en mi Query serian lo registros siguientes:

Registro 1 = N--3333--BBBBB--02
Registro 2 = N--3333--BBBBB--04

EL Query mostraria este resultado ya que los campos llaves son los mismos y existe un diferencia en el campo 4.

Gracias por su ayuda.
__________________
Hasta la victoria Siempre.
  #8 (permalink)  
Antiguo 01/03/2006, 12:41
Avatar de Cuezaltzin  
Fecha de Ingreso: diciembre-2003
Ubicación: Frente al Monitor
Mensajes: 252
Antigüedad: 20 años, 5 meses
Puntos: 0
Kiobo, al parecer ya encontre la solución a mi problema, pero la verdad es que es muy lento este query.

Alguien me podria ayudar a como mejor este query:

SELECT *
FROM table1 CROSS JOIN table2
WHERE table1.campo1 = table2.campo1 AND table1.campo2 = table2.campo2 AND table1.campo3 = table2.campo3 AND (table1.campo4 NOT IN (SELECT table2.campo4 FROM table2) OR table1.campo5 NOT IN (SELECT tabla2.campo5 FROM table2))

Gracias por su ayuda.
Saludos.
__________________
Hasta la victoria Siempre.
  #9 (permalink)  
Antiguo 02/03/2006, 13:02
Avatar de Mithrandir
Colaborador
 
Fecha de Ingreso: abril-2003
Mensajes: 12.106
Antigüedad: 21 años
Puntos: 25
Es lento porque tienes subquerys dentro de subquerys dentro de subquerys.

Eso lo quitas usando OUTER JOINS, aunque el código es un poco más difícil de leer.

Documéntate sobre como usar OUTER JOINs, si tienes alguna duda en particular no dudes en preguntar. Como tip te dejo esto:
Código:
SELECT * --todos los que existen en t1 y no en t2
FROM tabla1 t1
	LEFT OUTER JOIN tabla2 t2
ON t1.campo1 = t2.campo1
	AND t1.campo2 = t2.campo2
	AND t1.campo3 = t2.campo3
	AND t2.campo4 IS NULL
__________________
"El hombre, en su orgullo, creó a Dios a su imagen y semejanza."
Friedrich Nietzsche
  #10 (permalink)  
Antiguo 03/03/2006, 14:30
Avatar de Cuezaltzin  
Fecha de Ingreso: diciembre-2003
Ubicación: Frente al Monitor
Mensajes: 252
Antigüedad: 20 años, 5 meses
Puntos: 0
Que tal Mithrandir, gracias por la ayuda.

Eh intentado solucionar este problema por varios caminos incluyendo el del Outer Join pero pues sigo en la misma, sin poder resolver esto.

Por que te digo esto, por que que pasa si tengo esta información:

Table1
M--2222--AAAA--01--01
M--2222--AAAA--02--02
M--2222--AAAA--02--02

Table2
M--2222--AAAA--01--01
M--2222--AAAA--02--02
M--2222--AAAA--02--02

En este caso, el Query no me debe de regresar ningun registro. Y hasta ahorita con lo que eh probado pues me regresa los mismos valores.

Y pues sigo en la busqueda de como hacer dicha consulta, no se no existira alguna otra opción para hacerlo, por ejemplo en un Stored Procedure.

Pues eso es todo, y pues gracias por la ayuda.

Saludos.
__________________
Hasta la victoria Siempre.
  #11 (permalink)  
Antiguo 06/03/2006, 16:06
Avatar de Mithrandir
Colaborador
 
Fecha de Ingreso: abril-2003
Mensajes: 12.106
Antigüedad: 21 años
Puntos: 25
El query que te doy te permite saber eso. La clave es que sea un outer join y revisa la cláusula ON:
Código:
ON
...
AND t2.campo4 IS NULL
Eso es lo que te dice "todos los de aqui que no estén allá"

PD. Una corrección al SELECT es que debe ser "SELECT t1.*" y no "SELECT *"
__________________
"El hombre, en su orgullo, creó a Dios a su imagen y semejanza."
Friedrich Nietzsche
  #12 (permalink)  
Antiguo 23/03/2006, 15:37
Avatar de Cuezaltzin  
Fecha de Ingreso: diciembre-2003
Ubicación: Frente al Monitor
Mensajes: 252
Antigüedad: 20 años, 5 meses
Puntos: 0
No pues la verdad nada mas no me sale esto, ya le eh dado tantas vueltas. Pero pues nada mas no sale.

Este es el Query que estoy ejecutando:

SELECT T1.*
FROM table1 T1
LEFT OUTER JOIN table2 T2
ON T1.campo1 = T2.campo1
AND T1.campo2 = T2.campo2
AND T2.campo3 = T2.campo3
AND T2.campo5 IS NULL

Y pues en base a la información que tengo en las table1 y table 2 no me deberia de mostrar ningun registro pero pues sigo en las mismas me muestra los 3 registros.

Table1
M--2222--AAAA--01--01
M--2222--AAAA--02--02
M--2222--AAAA--02--02

Table2
M--2222--AAAA--01--01
M--2222--AAAA--02--02
M--2222--AAAA--02--02

Alguien que e pueda ayudar a resolver esta locura, gracias por su ayuda de antemano.
__________________
Hasta la victoria Siempre.
  #13 (permalink)  
Antiguo 24/03/2006, 16:14
Avatar de Mithrandir
Colaborador
 
Fecha de Ingreso: abril-2003
Mensajes: 12.106
Antigüedad: 21 años
Puntos: 25
Ok, entonces déjame recapitular. Quieres que se vean los que campo 4 y 5 no existan del otro lado, pero 1,2,3 sean iguales.

Eso se hace en 2 pasos, vamos por el primero. Ver lo de T1 que no está en T2, prueba a ver que tal va esto:

SELECT T1.*
FROM table1 T1
LEFT OUTER JOIN table2 T2
ON T1.campo1 = T2.campo1
AND T1.campo2 = T2.campo2
AND T1.campo3 = T2.campo3
AND T1.campo4 = T2.campo4
AND T1.campo5 = T2.campo5
WHERE T2.campo4 IS NULL
AND T2.campo5 IS NULL

...si no, voy a tener que hacer el experimento en un rato de ocio
__________________
"El hombre, en su orgullo, creó a Dios a su imagen y semejanza."
Friedrich Nietzsche
  #14 (permalink)  
Antiguo 27/03/2006, 16:33
Avatar de Cuezaltzin  
Fecha de Ingreso: diciembre-2003
Ubicación: Frente al Monitor
Mensajes: 252
Antigüedad: 20 años, 5 meses
Puntos: 0
Que tal Mithrandir, gracias por tu ayuda.

Pues en efecto estoy tratando de sacar los registros que no coincidan en los campo4 y/o campo5, pero que en los campo1,campo2 y campo3 sean identicos.

Y con el Query que me sugeriste me muestra los registros que en cualquier campo sean diferentes.

Gracias de nuevo por tu ayuda.
__________________
Hasta la victoria Siempre.
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 00:17.