En SQL estándar hay sin paréntesis en DISTINCT colA
. DISTINCT
no es una función.
SELECT DISTINCT colA
FROM mytable
WHERE colA NOT IN (SELECT DISTINCT colB FROM mytable);
Se agregó DISTINCT
a la sub-selección también. Si tiene muchos duplicados, podría acelerar la consulta.
Un CTE puede ser más rápido, dependiendo de su DBMS. Yo, además, demostrar LEFT JOIN
como alternativa para excluir los valores en valB
, y una forma alternativa de obtener valores distintos con GROUP BY
:
WITH x AS (SELECT colB FROM mytable GROUP BY colB)
SELECT m.colA
FROM mytable m
LEFT JOIN x ON x.colB = m.colA
WHERE x.colB IS NULL
GROUP BY m.colA;
O simplificado aún más, y con una subconsulta normal (probablemente el más rápido):
SELECT DISTINCT m.colA
FROM mytable m
LEFT JOIN mytable x ON x.colB = m.colA
WHERE x.colB IS NULL;
Hay básicamente 4 técnicas para excluir filas con claves presentes en otro (o el mismo) tabla:
El factor decisivo para la velocidad será índices. Debe tener índices en colA
y colB
para que esta consulta sea rápida.
'NOT IN' se ralentiza a medida que crece el tamaño del conjunto, y a menudo hay un límite en la cantidad de filas en la cláusula' NOT IN'. Aparte de los conjuntos de resultados pequeños, he encontrado que es mejor usar otros medios para obtener la diferencia entre dos conjuntos de resultados. – Paul
Cuando habla de rendimiento, debe nombrar su RDBMS u obtener respuestas poco óptimas. –