Isso já foi solicitado no Stack Overflow , mas apenas no MySQL. Estou usando o PostgreSQL. Infelizmente (e surpreendentemente) o PostgreSQL não parece ter algo parecido CHECKSUM table
.
Uma solução PostgreSQL seria boa, mas uma solução genérica seria melhor. Encontrei http://www.besttechtools.com/articles/article/sql-query-to-check-two-tables-have-identical-data , mas não entendo a lógica usada.
Antecedentes: reescrevi algum código de geração de banco de dados, portanto, preciso verificar se o código antigo e o novo produzem resultados idênticos.
postgresql
duplication
Faheem Mitha
fonte
fonte
EXCEPT
, verifique esta pergunta: Uma maneira eficiente de comparar dois grandes conjuntos de dados no SQLRespostas:
Uma opção é usar uma junção externa completa entre as duas tabelas no seguinte formato:
Por exemplo:
Retornará uma contagem de 2, enquanto que:
retorna a contagem esperada de 0.
O que eu mais gosto nesse método é que ele só precisa ler cada tabela uma vez, em vez de ler cada tabela duas vezes ao usar EXISTS. Além disso, isso deve funcionar para qualquer banco de dados que suporte junções externas completas (não apenas o Postgresql).
Geralmente desencorajo o uso da cláusula USING, mas aqui há uma situação em que acredito que seja a melhor abordagem.
Adendo 2019-05-03:
Se houver um problema com possíveis dados nulos, (ou seja, a coluna id não pode ser anulada, mas a val é), você pode tentar o seguinte:
fonte
Você pode usar o
EXCEPT
operador. Por exemplo, se as tabelas tiverem estrutura idêntica, o seguinte retornará todas as linhas que estão em uma tabela, mas não na outra (portanto, 0 linhas se as tabelas tiverem dados idênticos):Ou com
EXISTS
para retornar apenas um valor booleano ou uma string com um dos 2 resultados possíveis:Testado no SQLfiddle
Também não é o que
EXCEPT
remove duplicatas (isso não deve ser uma preocupação, se suas tabelas tiverem algumasPRIMARY KEY
ouUNIQUE
restrições, mas pode ser se você estiver comparando resultados de consultas arbitrárias que podem potencialmente produzir linhas duplicadas).Outra coisa que a
EXCEPT
palavra-chave faz é tratar osNULL
valores como idênticos; portanto, se a tabelaA
tiver uma linha com(1,2,NULL)
e a tabelaB
com(1,2,NULL)
, a primeira consulta não mostrará essas linhas e a segunda consulta retornará'same'
se as duas tabelas não tiverem outra linha.Se você quiser contar essas linhas como diferentes, poderá usar uma variação na
FULL JOIN
resposta dos gsiems para obter todas as linhas (diferentes):e para obter uma resposta sim / não:
Se todas as colunas das duas tabelas não forem anuláveis, as duas abordagens fornecerão respostas idênticas.
fonte
SELECT <column_list> FROM a
vez deTABLE a
EXCEPT
consulta é uma beleza!Você precisa da cláusula Exceto Algo como
Isso retorna todas as linhas da primeira tabela que não estão na segunda tabela
fonte
Olhando para o código vinculado, você não entende:
O molho secreto está usando
union
em oposição aunion all
. O primeiro mantém apenas linhas distintas, enquanto o último mantém duplicatas ( referência ). Em outras palavras, as consultas aninhadas dizem "me dê todas as linhas e colunas do EmpDtl1 e, além disso, as do EmpDtl2 que ainda não estão no EmpDtl1". A contagem dessa subconsulta será igual à contagem de EmpDtl1 se e somente se EmpDtl2 não contribuir com nenhuma linha para o resultado, ou seja, as duas tabelas são idênticas.Como alternativa, despeje as tabelas na sequência de chaves em dois arquivos de texto e use sua ferramenta de comparação de sua escolha.
fonte
EmpDtl2
houver menos linhas do queEmpDtl1
todas as linhas existentesEmpDtl1
.