¿Cómo seleccionar todos los registros de una tabla que no existen en otra?

tabla1 (id, nombre) tabla2 (id, nombre)

Consulta:

SELECT name   
FROM table2  
-- that are not in table1 already
Solución
SELECT t1.name
FROM table1 t1
LEFT JOIN table2 t2 ON t2.name = t1.name
WHERE t2.name IS NULL

Q: ¿Qué está pasando aquí?

A: Conceptualmente, seleccionamos todas las filas de la "tabla1" y para cada fila intentamos encontrar una fila en la "tabla2" con el mismo valor para la columna "nombre". Si no hay tal fila, dejamos la parte de la "tabla2" de nuestro resultado vacía para esa fila. A continuación, restringimos nuestra selección eligiendo sólo aquellas filas del resultado en las que no existe la fila coincidente. Por último, ignoramos todos los campos de nuestro resultado excepto la columna nombre (la que estamos seguros de que existe, de la tabla1).

Aunque puede que no sea el método más eficaz posible en todos los casos, debería funcionar básicamente en cualquier motor de base de datos que intente implementar ANSI 92 SQL.

Comentarios (14)

Puede hacer

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)

Ver esta pregunta para 3 técnicas para lograr esto

Comentarios (6)

Esto es pura teoría de conjuntos que puedes conseguir con la operación menos.

select id, name from table1
minus
select id, name from table2
Comentarios (4)