Respuestas:
SELECT t1.name
FROM table1 t1
LEFT JOIN table2 t2 ON t2.name = t1.name
WHERE t2.name IS NULL
P : ¿Qué está pasando aquí?
R : Conceptualmente, seleccionamos todas las filas de table1
y para cada fila intentamos encontrar una fila table2
con el mismo valor para la name
columna. Si no existe esa fila, solo dejamos la table2
parte de nuestro resultado vacía para esa fila. Luego, restringimos nuestra selección seleccionando solo aquellas filas en el resultado donde la fila coincidente no existe. Finalmente, ignoramos todos los campos de nuestro resultado, excepto la name
columna (la que estamos seguros de que existe table1
).
Si bien puede no ser el método más eficaz posible en todos los casos, debería funcionar básicamente en todos los motores de bases de datos que intentan implementar ANSI 92 SQL
Puedes 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)
Vea esta pregunta para 3 técnicas para lograr esto
No tengo suficientes puntos de representante para votar la segunda respuesta. Pero tengo que estar en desacuerdo con los comentarios en la respuesta superior. La segunda respuesta:
SELECT name
FROM table2
WHERE name NOT IN
(SELECT name
FROM table1)
Es MUCHO más eficiente en la práctica. No sé por qué, pero lo estoy ejecutando con más de 800k de registros y la diferencia es tremenda con la ventaja dada a la segunda respuesta publicada anteriormente. Solo mis $ 0.02
Esta es la teoría de conjuntos pura que puede lograr con la minus
operación.
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/
Cuidado con las trampas. Si el campo Name
de Table1
contener valores nulos usted está en para sorpresas. Mejor es:
SELECT name
FROM table2
WHERE name NOT IN
(SELECT ISNULL(name ,'')
FROM table1)
Esto es lo que funcionó mejor para mí.
SELECT *
FROM @T1
EXCEPT
SELECT a.*
FROM @T1 a
JOIN @T2 b ON a.ID = b.ID
Esto fue más del doble de rápido que cualquier otro método que probé.
Puedes usarlo EXCEPT
en mssql o MINUS
en oracle, son idénticos según:
Ese trabajo fuerte para mi
SELECT *
FROM [dbo].[table1] t1
LEFT JOIN [dbo].[table2] t2 ON t1.[t1_ID] = t2.[t2_ID]
WHERE t2.[t2_ID] IS NULL
Voy a volver a publicar (ya que todavía no soy lo suficientemente bueno como para comentar) en la respuesta correcta ... en caso de que alguien más pensara que necesitaba una mejor explicación.
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
Y he visto la sintaxis en FROM que necesita comas entre los nombres de las tablas en mySQL pero en sqlLite parecía preferir el espacio.
La conclusión es que cuando usas nombres de variables incorrectos, deja preguntas. Mis variables deberían tener más sentido. Y alguien debería explicar por qué necesitamos una coma o ninguna coma.
Si quieres seleccionar en usuario específico
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
es una clave principal de un usuario