una tablas tabla sobre seleccionar registros que otra existan estan datos consultar consulta comparar coincidentes buscar sql sql-server tsql

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



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.