decoding

Come fare la differenza dei dati di due tabelle di un database

Reading Time: 2 minutesFavoriteLoadingAggiungi ai preferiti

 

In un precedente post abbiamo visto come sia possibile eseguire  l’intersezione dei dati di due tabelle di un database.

In questo post voglio invece spiegare come è possibile fare la differenza dei dati di due tabelle con un database MySQL, un database MariaDB, un database PostegreSQL e un database Microsoft SQL, conosciuto come MSSQL.

Oggetto della discussione è la differenza su database relazionali.

I dati di cui disponiamo sono due tabelle, chiamate per semplicità t1 e t1b, aventi la stessa struttura, ossia due campi di testo contenenti stringhe.
Le due tabelle contengono lo stesso tipo di dati, ma con alcune differenze nei dati stessi.

Scopo del test è quindi verificare, che tipo di query bisogna costruire, per estrarre i dati che sono contenuti nella tabella t1, ma non sono contenuti nella tabella t1b.

Tutto in funzione del motore di database che si utilizza.

Questa la struttura dei dati di esempio.

Tabella t1

nome cognome
mario rossi
giovanni verdi
giuseppe bianchi
alessio gialli

Tabella t1b

nome cognome
mario rossi
andrea verdi
carlo bianchi
alfonso gialli
paolo marroni

Iniziamo eseguendo il test su Mysql e MariaDB.

La query di intersezione su Mysql

select nome, cognome from t1 
where (nome,cognome) NOT IN (
select nome,cognome from t1b
);

e questo è il risultato

nome cognome
giovanni verdi
giuseppe bianchi
alessio gialli

Eseguiamo ora il test sugli altri database modificando la query in modo da sfruttare l’operatore INTERSECT, non supportato da MySQL.

Eseguiamo ora il test su PostgreSQL

La query di intersezione su PostgreSQL è la seguente

select nome,cognome from t1 
EXCEPT
select nome,cognome from t1b;

e questo è il risultato

nome cognome
giovanni verdi
giuseppe bianchi
alessio gialli

Eseguiamo ora il test su MariaDB

La query di intersezione su MariaDB è la seguente

select nome,cognome from t1 
EXCEPT
select nome,cognome from t1b;

e questo è il risultato

nome cognome
giovanni verdi
giuseppe bianchi
alessio gialli

Eseguiamo ora il test su Microsoft SQL

La query di intersezione su Microsoft SQL è la seguente

select nome,cognome from t1 
EXCEPT
select nome,cognome from t1b;

e questo è il risultato

nome cognome
giovanni verdi
giuseppe bianchi
alessio gialli

Come avete certamente notato, MSSQL, PostegreSQL e MariaDB si comportano allo stesso modo, consentono di eseguire la stessa query, attraverso l’operatore EXCEPT

Mysql invece ci consente di eseguire l’intersezione attraverso l’esecuzione di una select di select, ossia tramite un annidamento.

Se proviamo ad utilizzare l’operatore EXCEPT con MySQL otteniamo l’errore seguente

1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'except
select nome,cognome from t1b' at line 2, Time: 0.010000s

Con tutti i motori citati, possiamo sempre utilizzare la query provata con MySQL, ossia

select nome, cognome from t1 
where (nome,cognome) NOT IN ( select nome,cognome from t1b );

 

Versioni dei motori SQL utilizzati

Microsoft SQL Server 2017 (RTM-CU13) (KB4466404) – 14.0.3048.4 (X64)

psql (PostgreSQL) 11.7 (Ubuntu 11.7-0ubuntu0.19.10.1)

MySQL Ver 8.0.18 for Linux on x86_64 (MySQL Community Server – GPL)

MariaDB 10.3.22-MariaDB-0ubuntu0.19.10.1