"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Como posso selecionar com eficiência linhas de uma tabela que não existem em outra?

Como posso selecionar com eficiência linhas de uma tabela que não existem em outra?

Publicado em 2024-11-03
Navegar:333

 How Can I Efficiently Select Rows from One Table That Don\'t Exist in Another?

Otimizando consultas SQL com tabelas "NOT IN"

No SQL, a seleção de linhas que existem em uma tabela, mas não em outra, pode ser obtida usando o "NOT IN" operador. No entanto, essa abordagem às vezes pode levar a problemas de desempenho para grandes conjuntos de dados.

Considere um cenário em que você tem duas tabelas, A e B, com as mesmas chaves primárias. Para selecionar todas as linhas de A que não estão presentes em B, você pode usar a seguinte consulta:

SELECT *
FROM A
WHERE NOT EXISTS (
  SELECT *
  FROM B
  WHERE A.pk = B.pk
);

Embora esta consulta funcione, ela pode ser ineficiente, especialmente para tabelas grandes. O banco de dados deve realizar uma consulta aninhada para cada linha em A, verificando sua presença em B.

Uma abordagem melhor é usar uma junção à esquerda e filtrar os resultados com base em valores nulos. Este método envolve unir A e B em uma coluna comum e, em seguida, selecionar linhas de A onde a coluna correspondente em B é nula:

SELECT A.*
FROM A
LEFT JOIN B
ON A.x = B.y
WHERE B.y IS NULL;

Esta consulta executa uma única operação de junção e filtra os resultados com base na ausência de um valor em B. Geralmente é mais rápida do que a abordagem "NOT IN" para grandes conjuntos de dados.

Como alternativa, você pode usar uma subconsulta na cláusula WHERE:

SELECT A.*    
FROM A
WHERE x NOT IN (
  SELECT y
  FROM B
);

Essa abordagem também pode fornecer bom desempenho para grandes conjuntos de dados.

Em última análise, o melhor método para otimizar a consulta depende dos dados específicos e da configuração do banco de dados. Recomenda-se testar diferentes abordagens e escolher aquela que oferece o desempenho ideal para sua consulta.

Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3