tabla1 (id, nombre)
tabla2 (id, nombre)¿Cómo seleccionar todos los registros de una tabla que no existen en otra tabla?
Consulta:
SELECT name
FROM table2
-- that are not in table1 already
tabla1 (id, nombre)
tabla2 (id, nombre)¿Cómo seleccionar todos los registros de una tabla que no existen en otra tabla?
Consulta:
SELECT name
FROM table2
-- that are not in table1 already
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í?
Un: Conceptualmente, seleccionamos todas las filas de table1
y para cada fila que intentan encontrar una fila en table2
con el mismo valor para la columna de name
. Si no existe dicha fila, simplemente dejamos la porción table2
de nuestro resultado vacía para esa fila. Luego restringimos nuestra selección seleccionando solo aquellas filas en el resultado donde la fila correspondiente no existe. Finalmente, ignoramos todos los campos de nuestro resultado excepto la columna name
(la que estamos seguros que existe, de table1
).
Si bien puede no ser el método mas potente posible en todos los casos, se debe trabajar en básicamente todos los motores de base de datos cada vez que los intentos de poner en práctica ANSI 92 SQL
@ z-boss: también es el menos eficiente en SQL Server: http://explainextended.com/2009/09/15/not-in-vs-not-exists-vs-left-join-is-null-sql -server/ –
Gracias, funciona bien con grandes conjuntos de datos – sirus
@Kris ¿puedes describir qué está pasando aquí? –
SELECT name
FROM table2
WHERE name NOT IN
(SELECT name
FROM table1)
o
SELECT name
FROM table2
WHERE NOT EXISTS
(SELECT *
FROM table2
WHERE table1.name = table2.name)
Ver this question de 3 técnicas para lograr esto
, la sintaxis "no disponible" también funciona en SQLite. – jftuga
Esto es increíblemente lento con grandes cantidades de datos. – Lightbulb1
Sí, de hecho es muy lento – sirus
Esta es la teoría de conjuntos puros que puede lograr con el minus
o peración.
select id, name from table1
minus
select id, name from table2
¿Crees que esto es mucho más eficiente que unirme a la izquierda? – uhs
Debería ser. El comando menos está diseñado para esta situación exacta. Por supuesto, la única forma de juzgar cualquier conjunto de datos en particular es probarlo en ambos sentidos y ver qué se ejecuta más rápido. – Winter
En T-SQL, el operador establecido es "excepto". Esto es muy conveniente para mí y no ha causado ninguna desaceleración. –
No tengo suficientes puntos de reputación para votar la segunda respuesta. Pero tengo que estar en desacuerdo con los comentarios sobre la respuesta principal. 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 contra 800k + registros y la diferencia es tremenda con la ventaja dada a la segunda respuesta publicada anteriormente. Solo mi $ 0.02
En la consulta NOT IN la subconsulta se realiza solo una vez, en la consulta EXISTS la subconsulta se realiza para cada fila – Carrick
eres genial :) de esta manera convierto mi consulta de 25 segundos usando la combinación izquierda a solo 0.1 segundos –
Tenga cuidado con las trampas. Si el campo Name
en Table1
contiene nulos, le sorprenderá. Mejor es:
SELECT name
FROM table2
WHERE name NOT IN
(SELECT ISNULL(name ,'')
FROM table1)
COALESCE> ISNULL (ISNULL es una adición de T-SQL inútil al lenguaje que no hace nada nuevo o mejor que COALESCE) – Kris
Puede utilizar EXCEPT
en mssql o MINUS
en el oráculo, que son idénticos en función de:
que el trabajo sostenido para mí
SELECT *
FROM [dbo].[table1] t1
LEFT JOIN [dbo].[table2] t2 ON t1.[t1_ID] = t2.[t2_ID]
WHERE t2.[t2_ID] IS NULL
está aquí 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é.
Para qué base de datos - SQL Server e Informix soportan TSQL. –