2010-10-28 5 views
27

alguien puede ayudarme a escribir SQL para una scernerio así:opuestos de una combinación interna de consulta

Table 1 

2 columns: ID, Name 

Table 2 

2 columns: ID, Name 

Quiero una consulta para mostrar los nombres de la tabla 1 que no están en la tabla 2. Así filtrar toda la los nombres en la tabla 1 que se encuentran en la tabla 2 son la consulta resultante. Use ID para el filtro no nombre.

Esto me ayudará en lo que estoy tratando de hacer. Gracias de antemano

+0

Nick, todas las sugerencias a continuación (las que utilizan una combinación y la comprobación de nula y las que se sugieren con una cláusula NOT IN) funcionarán. Sin embargo, si la velocidad es un problema, creo que NOT IN es más lento. Si la velocidad no es un problema, entonces el NOT IN probablemente sea más claro. – Matt

+0

Lo opuesto a INNER JOIN es un OUTER JOIN y viene en dos sabores: IZQUIERDA y DERECHA dependiendo de qué lado de JOIN quieres "externo" –

+1

@Matt: tu creencia es incorrecta, 'NOT IN' es más rápido . – Quassnoi

Respuesta

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

NO EXISTE es mucho más rápido. https://github.com/ebergstedt/sql_performance_left_outer_join_null_vs_not_exists –

16

utilizar esta consulta

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

esto funciona uniendo todo en t1 a t2 en todo lo que existe. la cláusula where filtra todos los registros que no existen en 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 

Creo que debería hacerlo.

20

Esto debería funcionar mejor que la versión left join...is null. Consulte here y here para realizar comparaciones.

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

Multa de rendimiento –

+0

@Eduardo Cuomo: No en SQL Server. –

+0

Lo pruebo en SQL Server y 500,000 registros. 3 segundos frente a 15 segundos ... –

Cuestiones relacionadas