none
comparar el resultado de dos consultas

    Question

  • ¿Alguna sugenrencia para comparar resultados de consultas?, utilizo sql server 2005 y vb net

    Tengo dos tablas, una tempral y una mas en las que guardo registros similares, necesito recorrer la tabla temporal revisando para comparar los registros contra los de la segunda tabla,  explico el prceso con el siguiente pseudocodigo:

     

    Por cada registro en la tabla temporal

         Buscar el registro equivalente en la tabla2 (busqueda con base a uan llave primaria)

         Si el registro existe en la tabla2,

               Comparar los demas campos (registro de tabla temporal vs registros tabla2)

               Si hubo cambios, actualizar tabla2, de lo contrario no hacer nada

         Si el registro no existe

               Insertarlo en tabla 2

    SIGUIENTE REGISTRO DE tabla temporal

     

    Mi pregunta, es si existe alguan manera mas facil de comprobar si existe diferencia entre los registros de la tabla temporal y tabla2

     

    Wednesday, October 06, 2010 3:13 PM

Answers

  • Una solución podría ser la siguiente:

    UPDATE tabla2 SET c1 = t.c1, ... FROM tabla2 t2 INNER JOIN tablaTemporal t ON t2.pk=t.pk AND t2.c1=t.c1 AND <resto de campos>

    INSERT tabla2 SELECT t.* FROM tabla2 t2 RIGHT JOIN tablaTemporal t ON t2.pk=t.pk WHERE t2.pk IS NULL

    • Proposed as answer by Carlos Sacristan Wednesday, October 06, 2010 3:32 PM
    • Marked as answer by DZUN Wednesday, October 06, 2010 5:39 PM
    Wednesday, October 06, 2010 3:32 PM
  • Hola.

    Existen muchos mecanismos, lo más eficaz suele ser hacer uso de un paquete de Integration Services que realice el cruce y la actualización. Si vas a basarte únicamente en consultas, podrías seguir el siguiente procedimiento, que busca tratar grupos de registros, no los registros de uno en uno:

    1. Cruzas las tablas con un left join para obtener los registros que no están en destino. Estos registros los puedes insertar directamente con un insert.. select. Sería así:

    insert Destino
    select O.* from Origen O left join Destino D on O.Clave = D.Clave where D.Clave is null
    

    2. Cruzas con un inner join, comparando campo por campo. Mira aquí cómo podrías hacerlo de forma dinámica: http://social.msdn.microsoft.com/Forums/es-ES/sqlserveres/thread/a7549b7c-cbdb-434b-85bb-cebc7a4e86d5

    Estos registros serían los que habría que actualizar. Puedes hacerlo de dos formas, o los eliminar y luego haces como si no estuvieran (punto 1) o los actualizas con un update campo por campo.

    3. Aunque no lo comentas, cabría la posibilidad de que hubiera registros a borrar. Esos serían los que salieran de cruzar la tabla con un right join:

    Delete D
    from Origen O right join Destino D on O.Clave = D.Clave where O.Clave is null
    
    

    Si no lo logras, nos dices.


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.blogspot.es/

    • Marked as answer by DZUN Wednesday, October 06, 2010 5:39 PM
    Wednesday, October 06, 2010 3:42 PM
    Moderator

All replies

  • Una solución podría ser la siguiente:

    UPDATE tabla2 SET c1 = t.c1, ... FROM tabla2 t2 INNER JOIN tablaTemporal t ON t2.pk=t.pk AND t2.c1=t.c1 AND <resto de campos>

    INSERT tabla2 SELECT t.* FROM tabla2 t2 RIGHT JOIN tablaTemporal t ON t2.pk=t.pk WHERE t2.pk IS NULL

    • Proposed as answer by Carlos Sacristan Wednesday, October 06, 2010 3:32 PM
    • Marked as answer by DZUN Wednesday, October 06, 2010 5:39 PM
    Wednesday, October 06, 2010 3:32 PM
  • Hola.

    Existen muchos mecanismos, lo más eficaz suele ser hacer uso de un paquete de Integration Services que realice el cruce y la actualización. Si vas a basarte únicamente en consultas, podrías seguir el siguiente procedimiento, que busca tratar grupos de registros, no los registros de uno en uno:

    1. Cruzas las tablas con un left join para obtener los registros que no están en destino. Estos registros los puedes insertar directamente con un insert.. select. Sería así:

    insert Destino
    select O.* from Origen O left join Destino D on O.Clave = D.Clave where D.Clave is null
    

    2. Cruzas con un inner join, comparando campo por campo. Mira aquí cómo podrías hacerlo de forma dinámica: http://social.msdn.microsoft.com/Forums/es-ES/sqlserveres/thread/a7549b7c-cbdb-434b-85bb-cebc7a4e86d5

    Estos registros serían los que habría que actualizar. Puedes hacerlo de dos formas, o los eliminar y luego haces como si no estuvieran (punto 1) o los actualizas con un update campo por campo.

    3. Aunque no lo comentas, cabría la posibilidad de que hubiera registros a borrar. Esos serían los que salieran de cruzar la tabla con un right join:

    Delete D
    from Origen O right join Destino D on O.Clave = D.Clave where O.Clave is null
    
    

    Si no lo logras, nos dices.


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.blogspot.es/

    • Marked as answer by DZUN Wednesday, October 06, 2010 5:39 PM
    Wednesday, October 06, 2010 3:42 PM
    Moderator
  • Hola buenas tardes en realiad soy nueva en foro y estuve leyendo el foro y me parece muy bueno y practico..

    necesito que por favor me ayunes ya que en realiad no lei nada al respecto..

    necesito hacer una consulta para al final actualizar varios valores

    tengo una tabla que se llama FACTURA que contiene los campos, idfactura, estado, monto...... y otra RECIBO que se relaciona mediante el campo idfactura.. entonces necesito comparar las dos tablas y buscar los idfacturas iguales en las 2 tablas para luego modificar el estado de la tabla.

    MUCHAS GRACIAS...

    Friday, February 24, 2012 10:18 PM
  • Si por supuesto a donde te envio la informacion ?

    Friday, December 13, 2013 9:56 PM
  • Hola aparte de las respuestas que te dieron podrías usar una unica sentencia MERGE para realizar la actualización de los datos que existen y agregar los datos que no existen en tabla de destino  http://msdn.microsoft.com/es-es/library/bb510625.aspx

    Juan Pablo Burgos


    Saturday, December 14, 2013 3:42 AM