Come selezionare tutti i record da una tabella che non esiste in un’altra tabella?

table1 (id, name)
table2 (id, name)

Query:

SELECT name FROM table2 -- that are not in table1 already 

 SELECT t1.name FROM table1 t1 LEFT JOIN table2 t2 ON t2.name = t1.name WHERE t2.name IS NULL 

D : Cosa sta succedendo qui?

A : Concettualmente, selezioniamo tutte le righe da table1 e per ogni riga cerchiamo di trovare una riga in table2 con lo stesso valore per la colonna name . Se non esiste una riga di questo tipo, lasciamo la porzione table2 del nostro risultato vuota per quella riga. Quindi vincoliamo la nostra selezione selezionando solo quelle righe nel risultato in cui la riga corrispondente non esiste. Infine, ignoriamo tutti i campi dal nostro risultato eccetto per la colonna del name (quella che siamo sicuri esista, dalla table1 ).

Anche se potrebbe non essere il metodo più performante ansible in tutti i casi, dovrebbe funzionare praticamente in ogni motore di database che tenta di implementare ANSI 92 SQL

Puoi farlo

 SELECT name FROM table2 WHERE name NOT IN (SELECT name FROM table1) 

o

 SELECT name FROM table2 WHERE NOT EXISTS (SELECT * FROM table1 WHERE table1.name = table2.name) 

Vedi questa domanda per 3 tecniche per realizzare questo

Non ho abbastanza punti rep per votare la seconda risposta. Ma non sono d’accordo con i commenti sulla risposta principale. La seconda risposta:

 SELECT name FROM table2 WHERE name NOT IN (SELECT name FROM table1) 

FAR è più efficiente nella pratica. Non so perché, ma lo sto eseguendo con record di 800k + e la differenza è enorme con il vantaggio dato alla seconda risposta pubblicata sopra. Solo il mio $ 0,02

Questa è pura teoria degli insiemi che puoi ottenere con l’operazione minus .

 select id, name from table1 minus select id, name from table2 

Fai attenzione alle insidie. Se il campo Name in Table1 contiene Null, ci sono sorprese. Meglio è:

 SELECT name FROM table2 WHERE name NOT IN (SELECT ISNULL(name ,'') FROM table1) 

Ecco cosa ha funzionato meglio per me.

 SELECT * FROM @T1 EXCEPT SELECT a.* FROM @T1 a JOIN @T2 b ON a.ID = b.ID 

Questo è stato più di due volte più veloce di qualsiasi altro metodo che ho provato.

Quel lavoro è stato acuto per me

 SELECT * FROM [dbo].[table1] t1 LEFT JOIN [dbo].[table2] t2 ON t1.[t1_ID] = t2.[t2_ID] WHERE t2.[t2_ID] IS NULL 

Ho intenzione di ripubblicare (dato che non sono ancora abbastanza bello da commentare) nella risposta corretta …. nel caso in cui qualcun altro pensasse che fosse necessario spiegare meglio.

 SELECT temp_table_1.name FROM original_table_1 temp_table_1 LEFT JOIN original_table_2 temp_table_2 ON temp_table_2.name = temp_table_1.name WHERE temp_table_2.name IS NULL 

E ho visto la syntax in FROM che aveva bisogno di virgole tra i nomi delle tabelle in mySQL, ma in sqlLite sembrava preferire lo spazio.

La linea di fondo è quando usi nomi di variabili cattivi che lasciano delle domande. Le mie variabili dovrebbero avere più senso. E qualcuno dovrebbe spiegare perché abbiamo bisogno di una virgola o nessuna virgola.