Me parece que puede hacer lo mismo en una consulta SQL usando NOT EXISTS, NOT IN, o LEFT JOIN WHERE IS NULL. Por ejemplo:
SELECT a FROM table1 WHERE a NOT IN (SELECT a FROM table2)
SELECT a FROM table1 WHERE NOT EXISTS (SELECT * FROM table2 WHERE table1.a = table2.a)
SELECT a FROM table1 LEFT JOIN table2 ON table1.a = table2.a WHERE table1.a IS NULL
No estoy seguro de tener toda la sintaxis correcta, pero estas son las técnicas generales que he visto. ¿Por qué elegiría usar uno sobre el otro? ¿El rendimiento difiere ...? ¿Cuál de estos es el más rápido / más eficiente? (Si depende de la implementación, ¿cuándo usaría cada una?)
EXISTS
cláusula. Puede regresar*
,NULL
o lo que sea: todo esto se optimizará.SELECT
yFROM
. Y*
es más fácil de escribir. Sí,SQL
tiene cierto parecido con un lenguaje natural, pero es analizado y ejecutado por una máquina, una máquina programada. No es que alguna vez irrumpirá repentinamente en su cubículo y gritará "¡deje de exigir los campos adicionales en unaEXISTS
consulta porque estoy harto de analizarlos y luego tirarlos!". Está bien con una computadora, de verdad.Respuestas:
NO EN CONT. NO EXISTE en ÚNICO IZQUIERDO / ES NULO: SQL Server
NO ENCENDIDO vs NO EXISTIDO VERSIÓN IZQUIERDA / ES NULO: PostgreSQL
NO ESTÁ EN CONTRA NO EXISTE en SIGUIENTE IZQUIERDA / ES NULO: Oracle
NO ENCENDIDO vs NO EXISTIDO VERSIÓN IZQUIERDA / ES NULO: MySQL
En una palabra:
NOT IN
es un poco diferente: nunca coincide si solo hay unoNULL
en la lista.En
MySQL
,NOT EXISTS
es un poco menos eficienteEn
SQL Server
,LEFT JOIN / IS NULL
es menos eficienteEn
PostgreSQL
,NOT IN
es menos eficienteEn
Oracle
, los tres métodos son iguales.fuente
table1 .a
contieneNULL
laEXISTS
consulta no devolverá esta fila, pero laNOT IN
consulta sitable2
está vacía. NOT IN vs. NOT EXISTS Nullable Columns: SQL ServerNULL NOT IN ()
evalúa como verdadero (noNULL
), tal comoNOT EXISTS (NULL = column)
NOT EXISTS
siempre va a devolver la fila, peroNOT IN
solamente lo harán si la consulta sub devuelve ninguna fila.Si la base de datos es buena para optimizar la consulta, los dos primeros se transformarán en algo cercano al tercero.
Para situaciones simples como las de su pregunta, debe haber poca o ninguna diferencia, ya que todas se ejecutarán como uniones. En consultas más complejas, es posible que la base de datos no pueda unir las consultas
not in
ynot exists
. En ese caso, las consultas serán mucho más lentas. Por otro lado, una unión también puede funcionar mal si no hay un índice que se pueda usar, por lo que solo porque use una unión no significa que esté seguro. Tendría que examinar el plan de ejecución de la consulta para saber si puede haber algún problema de rendimiento.fuente
Suponiendo que está evitando los valores nulos, son todas formas de escribir un anti-join usando Standard SQL.
Una omisión obvia es el equivalente usando
EXCEPT
:Tenga en cuenta que en Oracle debe usar el
MINUS
operador (posiblemente un mejor nombre):Hablando de sintaxis patentada, también puede haber equivalentes no estándar que vale la pena investigar dependiendo del producto que esté utilizando, por ejemplo,
OUTER APPLY
en SQL Server (algo así como):fuente
Cuando necesite insertar datos en la tabla con la clave primaria de múltiples campos, considere que será mucho más rápido (lo intenté en Access pero creo que en cualquier base de datos) para no verificar que "no existen registros con" tales "valores en la tabla", - simplemente inserte en la tabla, y el exceso de registros (por la tecla) no se insertará dos veces
fuente
La perspectiva del rendimiento siempre evita el uso de palabras clave inversas como NOT IN, NOT EXISTS, ... Porque para verificar los elementos inversos, DBMS necesita ejecutar todos los disponibles y descartar la selección inversa.
fuente
NOT
?