tablas - seleccionar registros de una tabla que no estan en otra mysql
¿Cómo seleccionar todos los registros de una tabla que no existen en otra tabla? (9)
Cuidado con las trampas. Si el campo Name
en la Table1
contiene valores nulos, se encontrará con sorpresas. Mejor es:
SELECT name
FROM table2
WHERE name NOT IN
(SELECT ISNULL(name ,'''')
FROM table1)
table1 (id, nombre)
table2 (id, nombre)
Consulta:
SELECT name
FROM table2
-- that are not in table1 already
Ese trabajo agudo 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
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é.
Esto es pura teoría de conjuntos que se puede lograr con la operación minus
.
select id, name from table1
minus
select id, name from table2
No tengo suficientes puntos de representación 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 haciendo contra más de 800k registros y la diferencia es tremenda con la ventaja dada a la segunda respuesta publicada anteriormente. Solo mi $ 0.02
Puede usar EXCEPT
en mssql o MINUS
en oracle, son idénticos según:
Usted 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)
Vea esta pregunta para 3 técnicas para lograr esto
Voy a volver a publicar (ya que 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 DESDE la necesidad de 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 no una coma.
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 la table1
y para cada fila intentamos encontrar una fila en la table2
con el mismo valor para la columna de name
. Si no hay tal fila, simplemente dejamos la parte de table2
de nuestro resultado vacío para esa fila. Luego restringimos nuestra selección seleccionando solo aquellas filas en el resultado donde no existe la fila coincidente. Finalmente, ignoramos todos los campos de nuestro resultado, excepto la columna de name
(la que estamos seguros de que existe, de la table1
).
Si bien puede que no sea el método más eficaz posible en todos los casos, debería funcionar en prácticamente todos los motores de base de datos que intenten implementar ANSI 92 SQL.