Foros del Web » Programando para Internet » ASP Clásico »

Comparar 2 tablas

Estas en el tema de Comparar 2 tablas en el foro de ASP Clásico en Foros del Web. Hola a todos... Tengo un problema que paso a comentaros: Tengo 2 tablas (de 2 bases de datos distintas). Una de esas tablas contiene determinada ...
  #1 (permalink)  
Antiguo 07/10/2005, 09:26
Avatar de 3pies
Colaborador
 
Fecha de Ingreso: diciembre-2003
Ubicación: Desde una destilería
Mensajes: 2.584
Antigüedad: 20 años, 4 meses
Puntos: 144
Comparar 2 tablas

Hola a todos...

Tengo un problema que paso a comentaros:

Tengo 2 tablas (de 2 bases de datos distintas). Una de esas tablas contiene determinada información, que debo comparar contra la otra tabla de la otra base de datos. Si los datos de esa primera tabla no están en la segunda, los debe añadir, y sino, pues no los añade :)

Hasta ahí, todo sencillo (al menos el planteamiento). El problema me surge con la solución al problema, pues en principio (y en final, porque no se me ocurren más alternativas), he pensado hacer lo siguiente:

Recorrer toda la primera tabla, registro a registro, dentro de un bucle, más o menos así:

Código:
Do while not rs.eof
	SQL="Select bla, bla, bla..."
	'Si no existe el registro ese de la tabla1 en la tabla2, lo añado, y sino, pues me voy de copas...
	'bla, bla, bla...
	'bla, bla, bla...
rs.MoveNext
Loop
El problema es que en el bucle, hay un select que mira determinado registro (el que corresponda en ese momento), para compararlo con la otra tabla, y creo que eso puede llegar a ser casi impertinente, porque estoy metiéndole demasiada "tralla" a ambas BD, haciendo demasiados select creo que innecesarios. Creo que no tiene nada de efectivo este sistema, pero es que no sé como solucionarlo de otra forma.

¿A alguien se le ocurre otro sistema?. ¿Existe alguna cláusula SQL para comparar tablas, que sea más efectivo que este sistema, casi rudimentario?.

Gracias, y salU2
  #2 (permalink)  
Antiguo 07/10/2005, 10:39
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 22 años, 3 meses
Puntos: 146
Pues la otra forma es crear una tabla temporal en una de las dos BD y copiar la otra tabla y ya ahí hacer el select que relacione las dos, luego ya borras la Tb temporal.

Dependiendo del número de regs. sería la carga en la BD.

Saludos
  #3 (permalink)  
Antiguo 07/10/2005, 10:51
Avatar de 3pies
Colaborador
 
Fecha de Ingreso: diciembre-2003
Ubicación: Desde una destilería
Mensajes: 2.584
Antigüedad: 20 años, 4 meses
Puntos: 144
Gracias Myakire, pero es más el select que relaciona las dos lo que no tengo claro.

Tal y como lo he planteado, haría esto:

Código:
1.- Abro la tabla1
2.- Hago un bucle para ir moviéndome por todos los registros (estoy en el bucle)
3.- Dentro del primer registro (primera vuelta al bucle), miro ese registro.
4.- Abro la tabla2
5.- Miro si el registro de la tabla1 está en esa tabla (la tabla2, haciendo un bucle en la tabla2 para recorrer todos los registros).
6.- Si está, no hago nada, y si no está, lo añado.
7.- Paso al siguiente registro de la tabla1.
8.- Una vez acabado, cierro, y limpio todo.
Es que no sé si eso es muy efectivo o hay alguna otra solución para el tema.

Gracias.
  #4 (permalink)  
Antiguo 07/10/2005, 10:57
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 22 años, 3 meses
Puntos: 146
mmmmm, ¿trabajas en SQL-Server o en Access?

Editado: baaahhh, olvida la pregunta, acabo de reeleer tu pregunta y veo que las dos tablas estan en dos BD's distintas, pero en el mismo server. El problema es cuando estan en diferente servidor.

Para lo que ocupas, yo haría una subconsulta que me regrese todos los registros que no esten en X tabla y luego los recorrería haciendo INSERT's para cada registro y listo.

Última edición por Myakire; 07/10/2005 a las 11:04
  #5 (permalink)  
Antiguo 07/10/2005, 10:59
Avatar de 3pies
Colaborador
 
Fecha de Ingreso: diciembre-2003
Ubicación: Desde una destilería
Mensajes: 2.584
Antigüedad: 20 años, 4 meses
Puntos: 144
No maestro. Mis requerimientos, se conforman con un simple Access.
  #6 (permalink)  
Antiguo 07/10/2005, 11:10
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 22 años, 3 meses
Puntos: 146
Si es con access se puede hacer igual la subconsulta:
Código:
tabla.open "Select * from Tabla1 where ID not in (select ID from BD.dbo.Tabla2)", ...
while not tabla.eof
   --insert--
   tabla.next
wend
o mejor aún, si fuera sql-server, llamar a un SP que haga o mismo con un cursor (aunque alguien me dijo una vez que no se deben usar cursores, pero bah, ¿que sabe ese experto 5 estrellas sql-server de microsoft?, jeje)
  #7 (permalink)  
Antiguo 07/10/2005, 11:18
Avatar de 3pies
Colaborador
 
Fecha de Ingreso: diciembre-2003
Ubicación: Desde una destilería
Mensajes: 2.584
Antigüedad: 20 años, 4 meses
Puntos: 144
Myakire he visto tu edición, y la respuesta final, y solo puedo decirte que las cosas que veo algo complicadillas, las conviertes en un plis plas, en algo tremendamente sencillo.

Un millón de gracias.
  #8 (permalink)  
Antiguo 07/10/2005, 12:43
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 22 años, 3 meses
Puntos: 146
Hombre 3pies, es tan poco usual leer comentarios como el tuyo que hasta me sentí mejor que el master U_G por un instante

eeeerrrrhhh, supongo que es por que ya es viernes
  #9 (permalink)  
Antiguo 07/10/2005, 12:47
Avatar de u_goldman
Moderador
 
Fecha de Ingreso: enero-2002
Mensajes: 8.031
Antigüedad: 22 años, 4 meses
Puntos: 98
En lo unico que soy mejor que todos los del foro es en lo de los viernes coincido ampliamente con 3pies, es excelente contar con gente tan talentosa como el maestrazo tiguron! un saludo y a darle que es viernes
__________________
"El hombre que ha empezado a vivir seriamente por dentro, empieza a vivir más sencillamente por fuera."
-- Ernest Hemingway
  #10 (permalink)  
Antiguo 07/10/2005, 12:48
Avatar de 3pies
Colaborador
 
Fecha de Ingreso: diciembre-2003
Ubicación: Desde una destilería
Mensajes: 2.584
Antigüedad: 20 años, 4 meses
Puntos: 144
De bien nacidos, es ser agradecidos (como dicen en mi tierra, y como seguramente dicen en cualquier lugar).

SalU2
  #11 (permalink)  
Antiguo 07/10/2005, 13:04
Avatar de JoseGCB  
Fecha de Ingreso: noviembre-2004
Ubicación: Caracas Venezuela
Mensajes: 91
Antigüedad: 19 años, 5 meses
Puntos: 0
Cita:
Iniciado por Myakire
o mejor aún, si fuera sql-server, llamar a un SP que haga o mismo con un cursor (aunque alguien me dijo una vez que no se deben usar cursores, pero bah, ¿que sabe ese experto 5 estrellas sql-server de microsoft?, jeje)

Disculpa Myakire pero como seria con SQlServer me gustaria saberlo
ya que trabajo con sql y se me presenta a menudo esta situacion

Gracias
  #12 (permalink)  
Antiguo 07/10/2005, 13:41
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 22 años, 3 meses
Puntos: 146
Pues sintaxis más, sintaxis menos, sería algo como esto:

Código:
DECLARE  @Campo1 AS INTEGER
DECLARE  @Campo2 AS INTEGER
	
DECLARE Registros CURSOR FOR
SELECT Campo1, Campo2 from Tabla WHERE ID NOT IN (Select ID From BD.dbo.Tabla)
OPEN Registros
FETCH NEXT FROM Registros INTO @Campo1,@Campo2
WHILE @@FETCH_STATUS = 0
BEGIN
   INSERT INTO DB.dbo.Tabla (Campo1, Campo2) VALUES (@Campo1,@Campo2)
   FETCH NEXT FROM Registros INTO @Campo1,@Campo2
END
CLOSE Registros
DEALLOCATE Registros
Saludos
  #13 (permalink)  
Antiguo 07/10/2005, 14:49
Avatar de JoseGCB  
Fecha de Ingreso: noviembre-2004
Ubicación: Caracas Venezuela
Mensajes: 91
Antigüedad: 19 años, 5 meses
Puntos: 0
gracias Myakire
lo probe y me funciono perfectamebnte
todo estaba correcto



saludos
  #14 (permalink)  
Antiguo 10/10/2005, 02:55
Avatar de 3pies
Colaborador
 
Fecha de Ingreso: diciembre-2003
Ubicación: Desde una destilería
Mensajes: 2.584
Antigüedad: 20 años, 4 meses
Puntos: 144
Una pequeña duda, Myakire, al hilo de este tema, y para no abrir otro...

He conseguido lo que pretendía, efectuando inserts, tal y como me sugeriste. En principio quería hacerlo a través de un recordset añadiendo un nuevo registro (addnew), pero me he encontrado con algo que nunca antes me había sucedido (supongo que porque nunca antes he realizado una operación de este tipo)...

He hecho una comparación de una tabla_1 contra la tabla_destino. Si los registros de la tabla_1 no están en la tabla_destino, los añado. Cierro la tabla_1, pero mantengo abierta la tabla_destino. Abro la tabla_2 y hago lo mismo, comparo si están los registros en la tabla_destino (que permanece abierta), y si no están, los añado.

Hasta aquí, todo correcto, pero el problema que tengo, añadiéndolo vía recordset es este: la tabla_1 y la tabla_2 pueden tener o no registros idénticos. Si añado algún registro desde la tabla_1 a la tabla_destino, cuando hago lo mismo con la tabla_2 hacia esa misma tabla_destino, me encuentro, con que los nuevos registros traspasados desde la tabla_1 no los reconoce como "existentes" en la tabla_destino, de tal forma que los de la tabla_2 me los vuelve a pasar a la tabla_destino. Vamos, es como si solo reconociera los datos existentes inicialmente en la tabla_destino (sobre los que efectúa la comparación la tabla_1). Esto no me ocurre (es decir, funciona correctamente, como debería funcionar), si cierro la tabla_destino una vez añadidos los registros de la tabla_1, y la vuelvo a abrir, cuando añado los registros de la tabla_2. He intentado cambiar el cerrojo (y hasta el cursor), para no tener que cerrar la tabla_destino en cada comparación/traspaso de registros, pero nada, sigue haciendo lo mismo, le ponga lo que le ponga.

Con los inserts no tengo problema, pues todo funciona perfectamente. Solo he intentado hacer una comparación de velocidad entre insert y addnew, para esta operación en concreto (ya sé que normalmente, un insert será más rápido). La verdad es que no lo he comparado, cerrando la tabla_destino y volviéndola a abrir, cada vez que comparo una tabla contra esa donde voy a grabar los datos únicos (no repetidos), es decir, contra esa tabla_destino.

En definitiva, mi duda se centra en el comportamiento de los addnew, cuando no cierro la tabla_destino. ¿Sabes por qué ocurre esto?. Al permanecer abierta la tabla_destino, es como si en cada comparación, solo tomara los datos iniciales (aunque se hayan añadido registros de la tabla_1, la tabla_2 es como si "no los viera" o no existiesen en la tabla_destino, por lo que me los añade también, y entonces me encuentro con que los tengo repetidos).

La verdad es que nunca había tenido la necesidad de hacer varias operaciones de este tipo (comparación-añadir) sobre una misma tabla, por eso nunca había visto este problema. Todo se soluciona cerrando el recordset y volviéndolo a abrir en cada comparación de tabla_X y tabla_destino, pero... ¿por qué no funciona como debería (ni cambiando cerrojos, ni ná de ná), si mantengo la tabla_destino abierta hasta el final de todo el proceso?.

Un millón de gracias.

PD: Perdón por el tocho, y perdón si he sido poco claro en mi explicación.

Última edición por 3pies; 10/10/2005 a las 03:19
  #15 (permalink)  
Antiguo 10/10/2005, 07:58
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 22 años, 3 meses
Puntos: 146
mmm, si entendí bien tu "pequeña" duda (jeje), es que si trabajas con objetos RS y en ellos haces las inserciones con AddNew's en lugar de INSERT's, estos no se ven reflejados sino hasta que cierras y abres el objeto.

Bueno, si este es el caso ese es un comportamiento normal y se basa principalmente en que cuando se trabaja con objetos ADO se trabaja en el cliente (useClient -> CursorLocation) y este en un buffer que no actualiza hasta que se llena, y como no se llena con pocas actualizaciones, solo se ve reflejado al cerra y abrir el cursor de datos. Puedes actualizar en cualquier momento el cursor con el método Requery de ADO y en teoría verías los cambios reflejados, pero en la práctica, a mi, me ha dado problemas y lo que yo acostumbro es cerrar y abrir el cursor, claro que eso es cuando tengo necesariamente que trabajar con actualizaciones en RS, ya que el 99% de las veces, prefiero trabajar directamente el la BD's con SP, pero access no los tiene.

Espero hacer sido más o menos claro en mi pobre explicación.

Saludos
  #16 (permalink)  
Antiguo 10/10/2005, 08:21
Avatar de 3pies
Colaborador
 
Fecha de Ingreso: diciembre-2003
Ubicación: Desde una destilería
Mensajes: 2.584
Antigüedad: 20 años, 4 meses
Puntos: 144
Gracias por tu gran ayuda a mi "pequeña" duda (no era tan pequeña, como ves, jajajaja).

Conclusión que saco: No tenía ni idea de que los cambios no se reflejaban hasta que se cerraba el recordset (se nota que todavía estoy muy verde).

Un millón de gracias, master.

Editado: Tu explicación no ha sido "pobre", sino "rica" en contenidos :)
  #17 (permalink)  
Antiguo 24/03/2010, 10:18
 
Fecha de Ingreso: marzo-2010
Mensajes: 1
Antigüedad: 14 años, 1 mes
Puntos: 0
Mensaje Respuesta: Comparar 2 tablas

este tema es viejo yo se... pero se refiere a algo que necesito hacer.. dentro de mi db esta inventory con la informacion actual y restaure que es un respaldo. necesito ver ambas en pantalla para poder comparar dos registros y componer una falla....

la cosa es que soy nuevo en eso y dentro de inventory y restaure hay varias tablas... pero solo me dijeron que las compare para poder ver los campos fabric y colo por ejemplo para comparar ambos dias y corregir un error.


no se que hacer?
  #18 (permalink)  
Antiguo 24/03/2010, 14:31
Avatar de Myakire
Colaborador
 
Fecha de Ingreso: enero-2002
Ubicación: Centro de la república
Mensajes: 8.849
Antigüedad: 22 años, 3 meses
Puntos: 146
Respuesta: Comparar 2 tablas

Bueno, efectivamente el tema es viejo y lo revives con algo que no contribuye a su solución original (aunque por lo que leo la solución propuesta no era muy optima, era mejor usar un INSERT - SELECT que un cursor, pero bueno, en el 2005 no me la sabía )

Este tema se cierra

Abre otro por favor con tu duda y una explicación un poco mejor, por eso no separa tu respuesta de este tema, por que me quedan duda de lo que quieres.

Entiendo que tienes dos BD's diferentes, cada una con las mismas tablas y debes de comprar cada tabla

Si es así, busca un poco en las respuestas anteriores, no hace mucho alguien ocupó exactamente eso.

Saludos
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.
Tema Cerrado




La zona horaria es GMT -6. Ahora son las 11:26.