2012-02-24 12 views
7

Ho due tabelle strutturalmente identiche, table2 è una base di staging per i nuovi dati che verranno utilizzati nella tabella di aggiornamento di massa1.MySQL confronta due tabelle e restituisce righe che hanno la stessa chiave primaria ma dati diversi in altri campi

Ho bisogno di scoprire quali righe verrebbero aggiornate in table1. Voglio ignorare le righe che verrebbero inserite e quelle che verrebbero eliminate. Sono solo interessato alle righe aggiornate, in cui la chiave primaria rimane la stessa, ma uno o più degli altri campi nella riga contiene dati diversi.

Finora il più vicino che ho ricevuto è la seguente dichiarazione.

SELECT table2.* FROM table2 
INNER JOIN table1 
ON table1.primarykey = table2.primarykey 
WHERE table1.field1 != table2.field1 
OR table1.field2 != table2.field2 
OR table1.field3 != table2.field3 

Restituisce 0 righe.

MODIFICA: la query funziona effettivamente. C'è stato un problema con i dati stessi. Ho intenzione di fare facepalm per un po '.

Grazie a tutti per il vostro contributo.

+1

I campi possono essere annullabili? –

+0

Come Conrad stava arrivando, null non è uguale a zero quindi devi tenerne conto nel tuo confronto - nel modo in cui lo hai scritto, i dati potrebbero essere "uguali" ma appariranno non uguali se ci sono valori nulli lì dentro. – Poodlehat

+1

Inoltre, se si utilizza un motore di archiviazione che lo consente, perché non disattivare semplicemente l'autocommit, eseguire l'aggiornamento e vedere cosa è cambiato, quindi ripristinarlo? – Poodlehat

risposta

4

Una cosa che il tuo non conta è null. Questo può o non può essere il vostro problema in quanto dipende dai dati

SELECT table2.* FROM table2 
INNER JOIN table1 
ON table1.primarykey = table2.primarykey 
WHERE table1.field1 != table2.field1 
     OR table1.field2 != table2.field2 
     OR table1.field3 != table2.field3 
     OR (table1.field1 is null and table2.field1 is not null) 
     OR (table2.field1 is null and table1.field1 is not null) 
     OR (table1.field2 is null and table2.field2 is not null) 
     OR (table2.field2 is null and table1.field2 is not null) 
     OR (table1.field3 is null and table2.field3 is not null) 
     OR (table2.field3 is null and table1.field3 is not null) 
0

In altre parole che si desidera a contare in tabella2 quante righe hanno una chiave primaria lo stesso come in tabella 1 e almeno uno dei campi diversi , destra? Ma come è importante se i dati sono diversi o no? Se i dati sono gli stessi, l'AGGIORNAMENTO non avrebbe alcun effetto.

SELECT 
    COUNT(T2.*) 
FROM 
    table2 AS T2 
JOIN table1 AS T1 ON (T1.primarykey = T2.primarykey); 
+0

Questo in realtà non risponde alla domanda, forse non hai letto l'intera domanda? saltò la pistola un po 'lì – pythonian29033

Problemi correlati