Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

mysql SELECT NOT IN () -- conjunto disjunto?


Você deve usar não 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 não é o melhor método para fazer isso, mesmo se você marcar apenas uma chave. A razão é que se você usar NOT EXISTS o DBMS só terá que verificar os índices se existirem índices para as colunas necessárias, enquanto que para NOT IN ele terá que ler os dados reais e criar um conjunto de resultados completo que posteriormente precisa ser verificado .

Usar um LEFT JOIN e, em seguida, verificar NULL também é uma má ideia, será dolorosamente lento quando as tabelas forem grandes, pois a consulta precisa fazer a junção inteira, lendo as duas tabelas completamente e, posteriormente, descartando muito. Além disso, se as colunas permitirem valores NULL, a verificação de NULL relatará falsos positivos.