Risposte:
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 proviamo a trovare una riga table2
con lo stesso valore per la name
colonna. Se non esiste tale riga, lasciamo table2
vuota solo la parte del nostro risultato per quella riga. Quindi limitiamo la nostra selezione selezionando solo quelle righe nel risultato in cui la riga corrispondente non esiste. Infine, ignoriamo tutti i campi dal nostro risultato tranne la name
colonna (quella di cui siamo sicuri che esiste, da table1
).
Anche se potrebbe non essere il metodo più performante possibile in tutti i casi, dovrebbe funzionare praticamente in tutti i motori di database che tentano di implementare ANSI 92 SQL
Puoi farlo entrambi
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 raggiungere questo obiettivo
Non ho abbastanza punti rep per votare la seconda risposta. Ma non sono d'accordo con i commenti sulla risposta in alto. La seconda risposta:
SELECT name
FROM table2
WHERE name NOT IN
(SELECT name
FROM table1)
È molto più efficiente in pratica. Non so perché, ma sto eseguendo contro 800k + record e la differenza è enorme con il vantaggio dato alla seconda risposta postata sopra. Solo i miei $ 0,02
Questa è pura teoria dell'insieme che puoi ottenere con l' minus
operazione.
select id, name from table1
minus
select id, name from table2
SELECT <column_list>
FROM TABLEA a
LEFTJOIN TABLEB b
ON a.Key = b.Key
WHERE b.Key IS NULL;
https://www.cloudways.com/blog/how-to-join-two-tables-mysql/
Fai attenzione alle insidie. Se il campo Name
in Table1
nulli siete 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ù del doppio rispetto a qualsiasi altro metodo che ho provato.
Puoi usare EXCEPT
in mssql o MINUS
in oracle, sono identici secondo:
Quel lavoro ha funzionato bene 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
Ripubblicherò (dato che non sono ancora abbastanza forte da commentare) nella risposta corretta ... nel caso in cui qualcun altro pensasse che fosse necessario spiegarlo 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 sintassi in FROM che ha bisogno di virgole tra i nomi delle tabelle in mySQL ma in sqlLite sembrava preferire lo spazio.
La linea di fondo è quando si usano nomi di variabili errate che lasciano domande. Le mie variabili dovrebbero avere più senso. E qualcuno dovrebbe spiegare perché abbiamo bisogno di una virgola o nessuna virgola.
Se si desidera selezionare un utente specifico
SELECT tent_nmr FROM Statio_Tentative_Mstr
WHERE tent_npk = '90009'
AND
tent_nmr NOT IN (SELECT permintaan_tent FROM Statio_Permintaan_Mstr)
La tent_npk
è una chiave primaria di un utente