Eu tenho duas tabelas com chave primária de ligação no banco de dados e desejo encontrar um conjunto separado entre elas. Por exemplo,
Table1
possui colunas (ID, Name
) e dados de amostra:(1 ,John), (2, Peter), (3, Mary)
Table2
possui colunas (ID, Address
) e dados de amostra:(1, address2), (2, address2)
Então, como eu crio uma consulta SQL para que eu possa buscar a linha com o ID daquele table1
que não está table2
. Nesse caso, (3, Mary)
deve ser retornado?
Ps. O ID é a chave primária para essas duas tabelas.
Desde já, obrigado.
sql
database
postgresql
johnklee
fonte
fonte
Respostas:
Tente isto
fonte
Usar
LEFT JOIN
fonte
Existem basicamente 3 abordagens para que:
not exists
,not in
eleft join / is null
.JUNTA ESQUERDA com IS NULL
NÃO EM
NÃO EXISTE
Qual é o melhor? A resposta a esta pergunta pode ser melhor dividida em grandes fornecedores específicos de RDBMS. De um modo geral, deve-se evitar o uso
select ... where ... in (select...)
quando a magnitude do número de registros na subconsulta for desconhecida. Alguns fornecedores podem limitar o tamanho. O Oracle, por exemplo, tem um limite de 1.000 . A melhor coisa a fazer é tentar os três e mostrar o plano de execução.Especificamente, forma o PostgreSQL, plano de execução
NOT EXISTS
eLEFT JOIN / IS NULL
é o mesmo. Pessoalmente, prefiro aNOT EXISTS
opção porque mostra melhor a intenção. Depois de toda a semântica é que você quiser encontrar registros em um que seus pk não existem em B .Porém, antigo mas ainda ouro, específico para o PostgreSQL: https://explainextended.com/2009/09/16/not-in-vs-not-exists-vs-left-join-is-null-postgresql/
fonte
Alternativa rápida
Fiz alguns testes (no postgres 9.5) usando duas tabelas com ~ 2 milhões de linhas cada. Esta consulta abaixo teve um desempenho pelo menos 5 * melhor do que as outras consultas propostas:
fonte
Tendo em mente os pontos mencionados no comentário / link de John Woo acima, é assim que eu normalmente lidaria com isso:
fonte
fonte