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

Comparar 2 tablas identicas y obtener registros que no coinciden mysql

Estas en el tema de Comparar 2 tablas identicas y obtener registros que no coinciden mysql en el foro de Mysql en Foros del Web. Cita: Iniciado por leonardo_josue Hola rhapsodyred: En realidad tienes muchas formas para obtener lo que necesitas, dependiendo de cómo quieres presentar la información, pero antes ...
  #1 (permalink)  
Antiguo 12/11/2015, 16:03
Avatar de bandolera  
Fecha de Ingreso: abril-2009
Mensajes: 613
Antigüedad: 15 años
Puntos: 7
Sonrisa Comparar 2 tablas identicas y obtener registros que no coinciden mysql

Cita:
Iniciado por leonardo_josue Ver Mensaje
Hola rhapsodyred:

En realidad tienes muchas formas para obtener lo que necesitas, dependiendo de cómo quieres presentar la información, pero antes que nada algunas consideraciones:

1. Según lo que planteas, los campos OPRID y NAMEUSR no cambian, sólo el ROLENAME.

2. el campo ID es tu campo llave y este tampoco debería considerarse para la consulta.

Partiendo de estos supuestos, te repito, hay muchas formas de hacer lo que pides. Hay un viejo dicho que dice "DIVIDE Y VENCERÁS", la consulta la puedes dividir en tres partes:

- Los registros que no cambiaron.
- Los privilegios originales que se eliminaron.
- Los privilegios nuevos que se agregaron.

De esta manera, puedes hacer tres subconsultas y unirlas con UNION, algo así:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM user_old;
  2. +------+--------+--------------+-------------------+
  3. | ID   | OPRID  | NAMEUSR      | ROLENAME          |
  4. +------+--------+--------------+-------------------+
  5. |    1 | PPEREZ | PEPITO PEREZ | ACCESO PORTAL WEB |
  6. |    2 | PPEREZ | PEPITO PEREZ | ADMINISTRADOR     |
  7. |    3 | PPEREZ | PEPITO PEREZ | CONSULTA CAB      |
  8. |    4 | PPEREZ | PEPITO PEREZ | REPORTE CAB       |
  9. +------+--------+--------------+-------------------+
  10. 4 rows in set (0.06 sec)
  11.  
  12. mysql> SELECT * FROM user_new;
  13. +------+--------+--------------+-------------------+
  14. | ID   | OPRID  | NAMEUSR      | ROLENAME          |
  15. +------+--------+--------------+-------------------+
  16. |    1 | PPEREZ | PEPITO PEREZ | ACCESO PORTAL WEB |
  17. |    2 | PPEREZ | PEPITO PEREZ | ADMINISTRADOR     |
  18. |    3 | PPEREZ | PEPITO PEREZ | CONSULTA PORTAL   |
  19. +------+--------+--------------+-------------------+
  20. 3 rows in set (0.00 sec)
  21.  
  22. mysql> SELECT user_old.*, 'SIN CAMBIOS' estatus
  23.     -> FROM user_old
  24.     -> INNER JOIN user_new ON
  25.     -> user_old.oprid = user_new.oprid AND
  26.     -> user_old.nameusr = user_new.nameusr AND
  27.     -> user_old.rolename = user_new.rolename
  28.     -> UNION
  29.     -> SELECT user_old.*, 'ELIMINADOS' estatus
  30.     -> FROM user_old
  31.     -> WHERE NOT EXISTS ( SELECT * FROM user_new
  32.     ->                    WHERE
  33.     ->                       user_old.oprid = user_new.oprid AND
  34.     ->               user_old.nameusr = user_new.nameusr AND
  35.     ->               user_old.rolename = user_new.rolename)
  36.     -> UNION
  37.     -> SELECT user_new.*, 'AGREGADOS' estatus
  38.     -> FROM user_new
  39.     -> WHERE NOT EXISTS ( SELECT * FROM user_old
  40.     ->                    WHERE
  41.     ->                       user_old.oprid = user_new.oprid AND
  42.     ->               user_old.nameusr = user_new.nameusr AND
  43.     ->               user_old.rolename = user_new.rolename);
  44. +------+--------+--------------+-------------------+-------------+
  45. | ID   | OPRID  | NAMEUSR      | ROLENAME          | estatus     |
  46. +------+--------+--------------+-------------------+-------------+
  47. |    1 | PPEREZ | PEPITO PEREZ | ACCESO PORTAL WEB | SIN CAMBIOS |
  48. |    2 | PPEREZ | PEPITO PEREZ | ADMINISTRADOR     | SIN CAMBIOS |
  49. |    3 | PPEREZ | PEPITO PEREZ | CONSULTA CAB      | ELIMINADOS  |
  50. |    4 | PPEREZ | PEPITO PEREZ | REPORTE CAB       | ELIMINADOS  |
  51. |    3 | PPEREZ | PEPITO PEREZ | CONSULTA PORTAL   | AGREGADOS   |
  52. +------+--------+--------------+-------------------+-------------+
  53. 5 rows in set (0.25 sec)

Dale un vistazo para ver si te sirve, trata de ejecutar cada subconsulta por separado para que entiendas su lógica, si continuas con problemas coméntalo en el foro.

Saludos
Leo
Interesante solución. Quisiera saber, en el caso de comparar una tabla maestra que tiene 50,000 registros y una que actualiza que tiene unso 3,000 registros.
Eso no hace lento el proceso ? Si es así hay alguna forma de optimizar el mismo?
Gracias.
__________________
Todos somos iguales. NO! a la violencia de género.
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 21:43.