Quiero aprender a comparar dos tablas para encontrar registros no coincidentes.

Soy un principiante total en MySQL y, por lo tanto, estoy luchando actualmente para averiguar qué consulta usar para comparar dos tablas.

Supongamos que tengo dos tablas que son idénticas en estructura.

Tabla 1 (antigua)

+------+--------+---------------+--------+-----------+
| "id" | "name" | "price" | "description" | "country" |
+------+--------+---------------+--------+-----------+
| "1"  | "a"    | "2"     | "Lord "       | "US"      |
| "2"  | "b"    | "3"     | "Taker"       | "UK"      |
+------+--------+---------------+--------+-----------+

Tabla 2 (nueva)

+------+--------+---------------+--------+-----------+
| "id" | "name" | "price" | "description" | "country" |
+------+--------+---------------+--------+-----------+
| "1"  | "a"    | "5"     | "Lord"        | "DE"      |
| "2"  | "b"    | "6"     | "Taker"      | "JP"      |
+------+--------+---------------+--------+-----------+

Table1 contiene los datos obsoletos y table2 el más nuevo.

Quiero comprobar si los campos de nombre, precio y descripción de la tabla 2 coinciden con los campos de nombre, precio y descripción de la tabla 1. De lo contrario, debería actualizar la tabla 1 con los datos de la tabla 2.

Verifiqué el sitio de seguimiento para averiguar qué uso de la consulta Mysql: http://www.mysqltutorial.org/compare -two-tables-to-find-unmatched-records-mysql.aspx

Pero no puedo entender cómo escribirlo en Python.

Soy nuevo en el uso de sentencias SQL en python y lo he intentado como,

 import sys, mysql.connector
 import mysql

 try:
     connection = mysql.connector.connect\
         (host = "localhost", user = "root", passwd ="", db = "local")
 except:
     print("No connection")
     sys.exit(0)

 cursor = connection.cursor()
 cursor.execute("SELECT name, price, description FROM table2_new WHERE 

No tengo ni idea de cómo continuar. Busqué tareas similares pero no entiendo completamente cómo hacerlo en Python.

Esa es la salida deseada para la tabla 1, los precios deben actualizarse:

    +------+--------+---------------+--------+-----------+
    | "id" | "name" | "price" | "description" | "country" |
    +------+--------+---------------+--------+-----------+
    | "1"  | "a"    | "5"     | "Lord "       | "US"      |
    | "2"  | "b"    | "6"     | "Taker"       | "UK"      |
    +------+--------+---------------+--------+-----------+

Podrían ustedes ayudarme? Cualquier comentario es apreciado.

2
Serious Ruffy 10 dic. 2015 a las 17:02

3 respuestas

La mejor respuesta

Al principio, ¿por qué campo (-s) se enlazan sus tablas? Vamos a nombrarlo bind_field. Si hay más de un campo, será bind_field1, bind_field2 y otro. Su consulta:

UPDATE table1 t1
INNER JOIN table2 t2
ON t1.bind_field = t2.bind_field [AND t1.bind_field1 = t2.bind_field2 ...]
SET t1.name = t2.name, t1.price = t2.price, t1.description = t2.description

La consulta actualiza los campos name, price, description de table1 con valores de table2 solo para las filas, que tienen los mismos bind_field (-s , si hay más de un campo de enlace).

La instrucción ON le permite cómo se unen sus tablas. La instrucción SET le permite controlar los valores de actualización.

Y me parece que usas un campo de texto (VARCHAR o igual) con id. Si es así, debe cambiarlo a un campo de tipo de número como INTEGER;

PD Lo siento por mi ingles :)

1
antonio_antuan 10 dic. 2015 a las 14:44

Tratar;

update table_1 a
join table_2 b
on a.`name` = b.`name` and a.`description` = b.`description`
set a.`price` = b.`price`

Demostración sqlfiddle

Este query actualizará price de table_1 con price de table_2, si description y name coinciden. (tenga cuidado con más de una coincidencia que no dará el resultado que espera)

1
Praveen 10 dic. 2015 a las 14:27

Su consulta SQL será algo similar a:

UPDATE t1
SET t1.name = t2.name
from table1 as t1
inner join table2 as t2
on t1.id = t2.id
AND t1.name != t2.name

Luego repita para cada campo.

1
ctrl-alt-delete 10 dic. 2015 a las 14:35