sql >> Base de Datos >  >> RDS >> Mysql

mysql SELECCIONE NO EN () -- conjunto disjunto?

Deberías usar no existe:

SELECT DISTINCT a, b, c FROM t1 WHERE NOT EXISTS (SELECT NULL FROM t2 WHERE t1.a = t2.a AND t1.b = t2.b AND t1.c = t2.c)

Usar NOT IN no es el mejor método para hacer esto, incluso si solo marca una tecla. La razón es que si usa NOT EXISTS, el DBMS solo tendrá que verificar los índices si existen índices para las columnas necesarias, mientras que NOT IN tendrá que leer los datos reales y crear un conjunto de resultados completo que posteriormente debe verificarse. .

Usar LEFT JOIN y luego verificar NULL también es una mala idea, será terriblemente lento cuando las tablas sean grandes, ya que la consulta debe hacer la combinación completa, leer ambas tablas por completo y, posteriormente, desechar una gran cantidad. Además, si las columnas permiten valores NULL, la comprobación de NULL generará falsos positivos.