Estou tentando comparar duas tabelas, SQL Server, para verificar alguns dados. Desejo retornar todas as linhas de ambas as tabelas em que os dados estão em uma ou na outra. Em essência, quero mostrar todas as discrepâncias. Preciso verificar três dados para fazer isso, Nome, Sobrenome e Produto.
Sou bastante novo no SQL e parece que muitas das soluções que estou encontrando estão complicando as coisas. Não preciso me preocupar com NULLs.
Comecei tentando algo assim:
SELECT DISTINCT [First Name], [Last Name], [Product Name] FROM [Temp Test Data]
WHERE ([First Name] NOT IN (SELECT [First Name]
FROM [Real Data]))
Estou tendo problemas para levar isso adiante ainda mais.
Obrigado!
EDITAR:
Com base na resposta de @treaschf, tenho tentado usar uma variação da seguinte consulta:
SELECT td.[First Name], td.[Last Name], td.[Product Name]
FROM [Temp Test Data] td FULL OUTER JOIN [Data] AS d
ON td.[First Name] = d.[First Name] AND td.[Last Name] = d.[Last Name]
WHERE (d.[First Name] = NULL) AND (d.[Last Name] = NULL)
Mas eu continuo recebendo 0 resultados quando sei que há pelo menos 1 linha em td que não está em d.
EDITAR:
Ok, acho que descobri. Pelo menos nos meus poucos minutos de teste, parece funcionar suficientemente bem.
SELECT [First Name], [Last Name]
FROM [Temp Test Data] AS td
WHERE (NOT EXISTS
(SELECT [First Name], [Last Name]
FROM [Data] AS d
WHERE ([First Name] = td.[First Name]) OR ([Last Name] = td.[Last Name])))
Basicamente, isso vai me dizer o que há nos meus dados de teste que não estão nos meus dados reais. O que é completamente bom para o que eu preciso fazer.
Respostas:
SE você possui tabelas
A
eB
, ambas com columC
, eis os registros presentes na tabela,A
mas não emB
:Para obter todas as diferenças com uma única consulta, uma associação completa deve ser usada, assim:
O que você precisa saber nesse caso é que, quando um registro puder ser encontrado em
A
, mas não emB
, as colunas que vieremB
serão NULL, e da mesma forma para as que estão presentes emB
e não emA
, as colunas deA
will ser nulo.fonte
The objects "a.dbo.student" and "b.dbo.student" in the FROM clause have the same exposed names. Use correlation names to distinguish them.
Eu recebo erro se os nomes das tabelas forem iguais e você os extrai de dois bancos de dados diferentes.a.dbo.student as
eb.dbo.student bs
, em seguida, consulte as tabelas comas
ebs
fonte
SELECT *
funciona se este for o caso de todas as colunas; Caso contrário, selecione apenas um subconjunto.Sei que essa pode não ser uma resposta popular, mas concordo com o @Randy Minder em usar a ferramenta de terceiros quando é necessária uma comparação mais complexa.
Esse caso específico aqui é fácil e, para esse caso, essas ferramentas não são necessárias, mas podem ser complexas facilmente se você introduzir mais colunas, bancos de dados em dois servidores, critérios de comparação mais complexos e outros.
Existem muitas dessas ferramentas, como ApexSQL Data Diff ou Quest Toad, e você sempre pode usá-las no modo de teste para concluir o trabalho.
fonte
tablediff
utilitário de linha de comando do SQL Server referido aqui .Para obter todas as diferenças entre duas tabelas, você pode usar como eu esta solicitação SQL:
fonte
Variação simples na resposta @erikkallen que mostra em qual tabela a linha está presente:
Se você receber um erro
então pode ajudar a adicionar
fonte
All queries combined using a UNION, INTERSECT or EXCEPT operator must have an equal number of expressions in their target lists.
com essa seleção. Eu tive que adicionar a'table1' as source,
parte também à parte Except. - Eu editei a resposta para isso.Se você deseja obter quais valores de coluna são diferentes, use o modelo Entity-Attribute-Value:
EXEMPLO FIDDLE DO SQL
fonte
Tente o seguinte:
Muito mais simples de ler.
fonte
Isso fará o truque, semelhante à solução de Tiago , retorne a tabela "source" também.
O resultado conterá diferenças entre as tabelas. Na coluna _tabloc, você terá referência à tabela.
fonte
Apresentando o Cadillac of Diffs como um SP. Veja o modelo básico baseado na resposta de @erikkallen. Suporta
Uso:
Código:
fonte
Você pode usar, exceto, por exemplo, algo como isto:
fonte
Para um teste simples de fumaça em que você está tentando garantir que duas tabelas correspondam sem se preocupar com os nomes das colunas:
Você pode escrever facilmente um procedimento de armazenamento para comparar um lote de tabelas.
fonte
Há um problema de desempenho relacionado à junção esquerda e à junção completa com grandes dados.
Na minha opinião, esta é a melhor solução:
fonte