2010-10-28 15 views
27

qualcuno può aiutarmi a scrivere SQL per uno scernerio come questo:opposto di un Inner Join Query

Table 1 

2 columns: ID, Name 

Table 2 

2 columns: ID, Name 

Voglio una query per visualizzare i nomi dalla tabella 1 che non sono nella tabella 2. Quindi filtrare tutte le i nomi nella tabella 1 presenti nella tabella 2 sono la query dei risultati. Usa ID per il filtro e non il nome.

Questo mi aiuterà in quello che sto cercando di fare. Grazie in anticipo

+0

Nick, tutti i suggerimenti riportati di seguito (quelli che utilizzano un join e il controllo di null e quelli che suggeriscono di utilizzare una clausola NOT IN) funzioneranno. Tuttavia, se la velocità è un problema, credo che NOT IN sia più lento. Se la velocità non è un problema, allora NOT IN è probabilmente più chiaro. – Matt

+0

L'opposto di INNER JOIN è un OUTER JOIN ed è disponibile in due versioni: SINISTRA e DESTRA a seconda del lato del JOIN che vuoi "esterno" –

+1

@Matt: la tua opinione è sbagliata, 'NOT IN' è più veloce . – Quassnoi

risposta

43
Select * from table1 
left join table2 on table1.id = table2.id 
where table2.id is null 
+1

NON ESISTE è molto più veloce. https://github.com/ebergstedt/sql_performance_left_outer_join_null_vs_not_exists –

16

utilizzare questa query

select 
t1.* 
from table1 t1 
left outer join table2 t2 
on t1.id=t2.id 
where t2.id is null 

questo funziona unendo tutto in t1 a tutto ciò che esiste in T2. la clausola where filtra tutti i record che non esistono in t2.

3
SELECT Table1.ID, Table1.Name, Table2.ID 
FROM Table1 LEFT OUTER JOIN Table2 ON Table1.ID = Table2.ID 
WHERE Table2.ID IS NULL 

Penso che dovrebbe farlo.

20

Questo dovrebbe funzionare meglio della versione left join...is null. Vedere here e here per i confronti.

select t1.id, t1.name 
    from table1 t1 
    where not exists(select null from table2 t2 where t2.id = t1.id) 
+0

Penalità di prestazione –

+0

@ Eduardo Cuomo: non in SQL Server. –

+0

Lo collaudo su SQL Server e 500.000 record. 3 secondi vs 15 secondi ... –