back to top

Confrontare due tabelle e trovare i record senza corrispondenza

all’interno di un database relazionale può essere utile poter identificare, rapidamente, i record di una tabella che non trovano corrispondenza all’interno di un’altra tabella usualmente utilizzata per delle JOIN. Per fare ciò, in pratica, dovremo confrontare due tabelle, concepite per essere legate da un vincolo di JOIN, ed estrarre tutti i record privi di un collegamento.

Per fare un esempio supponiamo di avere un database con due tabelle così strutturate:

  • utenti
    • id
    • username
    • password
  • anagrafica
    • id_utente
    • nome
    • cognome
    • indirizzo
    • cap
    • citta
    • provincia

Nella tabella "utenti" vengono memorizzati i dati di accesso di tutti gli utenti abilitati, mentre nella tabella "anagrafica" vengono registrati i dati anagrafici degli utenti che hanno completato il proprio profilo.

Le due tabelle sono concettualmente legate tra loro da una relazione in quanto il campo "id_utente" dela tabella "anagrafica" è utilizzato per creare delle JOIN con il campo "id" della tabella "utenti".

Ora supponiamo di voler identificare, attraverso una query SQL, tutti gli utenti che non hanno completato il profilio, cioè tutti i record della tabella "utenti" che non hanno un corrispettivo nella tabella "anagrafica".

Per farlo possiamo utilizzare differenti query:

1) Utilizziamo una LEFT JOIN

SELECT u.id
FROM utenti AS u
LEFT JOIN anagrafica AS a 
ON u.id = a.id_utente
WHERE a.nome IS NULL

2) Utilizziamo una subquery

SELECT id
FROM uteni
WHERE id NOT IN (
  SELECT id_utente 
  FROM anagrafica
)

oppure:

SELECT id 
FROM utenti 
WHERE NOT EXISTS (
  SELECT * 
  FROM anagrafica 
  WHERE utenti.id = anagrafica.id_utente
)

In tutti i casi otterremo in risposta dal DBMS un elenco egli identificativi della tabella "utenti" che non trovano nessuna corrispondenza in "anagrafica".

Negli esempi visi sopra abbiamo utilizzato delle query per effettuare delle SELECT ma nulla vieta, ad esempio, di utilizzare le medesime tecniche per effettuare delle cancellazioni. Si supponga, ad esempio, di voler cancellare tutti gli utenti del sito che non hanno compilato una scheda anagrafica. Per farlo sarà sufficiente lanciare la seguente query:

DELETE 
FROM utenti 
WHERE NOT EXISTS (
  SELECT * 
  FROM anagrafica 
  WHERE utenti.id = anagrafica.id_utente
)

L’istruzione qui sopra effettuerà la cancellazione di tutti i record della tabella "utenti" che non trovano corrispondenza nella tabella "anagrafica".

Pubblicitร 
Massimiliano Bossi
Massimiliano Bossi
Stregato dalla rete sin dai tempi delle BBS e dei modem a 2.400 baud, ho avuto la fortuna di poter trasformare la mia passione in un lavoro (nonostante una Laurea in Giurisprudenza). Adoro scrivere codice e mi occupo quotidianamente di comunicazione, design e nuovi media digitali. Orgogliosamente "nerd" sono il fondatore di MRW.it (per il quale ho scritto centinaia di articoli) e di una nota Web-Agency (dove seguo in prima persona progetti digitali per numerosi clienti sia in Italia che all'estero).

Leggi anche...

Come ottenere l’ID dell’ultimo record inserito in MySQL, PostgreSQL, SQL Server e Oracle?

Ottenere l'ID dell'ultimo record inserito in una tabella, dopo...

Database completo regioni, province e comuni italiani (in formato SQL)

Quando si sviluppa un sito web o un'applicazione in...

File CSV: cosa sono, come si aprono e come crearli

In questo articolo cercheremo di capire cos'รจ il formato...

Eseguire comandi SQL online con SQL Fiddle

Sì. E' possibile testare codice SQL senza aver installato...

SQL: Calcolare la media dei valori di più campi

Attraverso una semplice query SQL è possibile calcolare dinamicamente...

MySQL: modificare il valore di AUTO_INCREMENT

Come è noto, l'attributo AUTO_INCREMENT di MySQL può essere...
Pubblicitร