Usuário com melhor resposta
Trazer dados diferentes entre resultado de duas consultas

Pergunta
-
Bom dia galera, Executei duas consultas SQL com vários "Join" cada, e cheguei aos resultados desejados, então minha duvida é a seguinte, a primeira consulta me trouxe 3000 registros, e a segunda me trouxe 2400, esses 600 registros estão pendentes no sistema, então gostaria de saber se existe alguma forma de trazer esses 600 registros divergentes entre essas duas consultas.
Simplificando, gostaria de trazer todos os registros diferentes entre esses duas consultas.
http://luisgustavo12.wordpress.com/
Respostas
-
GuSouza,
Para obter a diferença entre a primeira consula (3000 registros) em relação a segunda consulta (2400 registros) você poderá utilizar a instrução EXCEPT.
Como alternativa, você poderá utilizar uma subquery na primeira consulta comparando com NOT EXISTS.
Para maiores informações veja:
https://msdn.microsoft.com/pt-br/library/ms188055%28v=sql.120%29.aspx
https://technet.microsoft.com/pt-br/library/ms184297(v=sql.105).aspx
Se ajudou na sua solução, não esqueça de marcar como resposta !
Abraços,
Durval Ramos
Microsoft Partner | MTA | MCSA - SQL Server 2012 | MCSE - Data Platform
----------------------------------
Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"- Sugerido como Resposta Lucio Rogerio SPBanned segunda-feira, 29 de junho de 2015 15:48
- Marcado como Resposta Durval RamosModerator domingo, 2 de agosto de 2015 03:15
-
Deleted
- Marcado como Resposta Durval RamosModerator domingo, 2 de agosto de 2015 03:15
terça-feira, 30 de junho de 2015 11:22
Todas as Respostas
-
Bom dia GuSouza.
Não entendi muito bem a sua duvida, pelo que eu entendi acho que vc quer trazer 600 registro em uma unica consulta se for isso tem como sim. Bem para ficar mas fácil pra gente te ajudar poste as duas consulta pra que possamos analisar e pode te ajudar melhor.
-
GuSouza,
Para obter a diferença entre a primeira consula (3000 registros) em relação a segunda consulta (2400 registros) você poderá utilizar a instrução EXCEPT.
Como alternativa, você poderá utilizar uma subquery na primeira consulta comparando com NOT EXISTS.
Para maiores informações veja:
https://msdn.microsoft.com/pt-br/library/ms188055%28v=sql.120%29.aspx
https://technet.microsoft.com/pt-br/library/ms184297(v=sql.105).aspx
Se ajudou na sua solução, não esqueça de marcar como resposta !
Abraços,
Durval Ramos
Microsoft Partner | MTA | MCSA - SQL Server 2012 | MCSE - Data Platform
----------------------------------
Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"- Sugerido como Resposta Lucio Rogerio SPBanned segunda-feira, 29 de junho de 2015 15:48
- Marcado como Resposta Durval RamosModerator domingo, 2 de agosto de 2015 03:15
-
Luís Gustavo, o que necessita é a aplicação da operação
C = A - B
onde A é a primeira consulta e B é a segunda consulta.A operação pode ser implementada de várias formas:
-- código 1 with Consulta1 as ( código da consulta que retorna 3000 linhas ), Consulta2 as ( código da consulta que retorna 2400 linhas ) SELECT T1.* from Consulta1 as T1 except SELECT T2.* from Consulta2 as T2;
ou ainda
-- código 2 with Consulta1 as ( código da consulta que retorna 3000 linhas ), Consulta2 as ( código da consulta que retorna 2400 linhas ) SELECT T1.* from Consulta1 as T1 where not Exists (SELECT * from Consulta2 as T2 where T2.chave = T1.chave);
Também é possível implementar a operação com LEFT JOIN, NOT IN etc.
Essas consultas serão realizadas frequentemente ou é somente um processo ocasional de validação dos dados?
José Diz Belo Horizonte, MG - Brasil
(Se encontrou a solução nesta resposta, ou se o conteúdo foi útil, lembre-se de marcá-la)
Bom dia José, executei o primeiro exemplo passado por você, pois as duas consultas não tem uma "Chave" que possa diferenciar uma da outra.
O problema é que obtive um resultado com 3299 registros.
http://luisgustavo12.wordpress.com/
-
José, As duas tabelas trazem os mesmos campos na mesma sequencia.
segue abaixo o resultado da consulta
669 20/04/2015 010.0001 ITEM 1 1 762 20/04/2015 010.0001 ITEM 1 2 826 20/04/2015 010.0001 ITEM 1 3 3008 29/01/2015 002.0007 ITEM 2 4 3032 06/02/2015 002.0007 ITEM 2 5 3669 20/04/2015 012.0001 ITEM 3 6 3762 20/04/2015 012.0001 ITEM 3 7 544 20/04/2015 010.0201 ITEM 5 100 89465 20/04/2015 010.0201 ITEM 5 200 823 20/04/2015 010.0201 ITEM 5 300 3048 29/01/2015 002.0015 ITEM 47 445 3092 06/02/2015 002.0015 ITEM 47 565 3879 20/04/2015 012.0069 ITEM 36 684 3932 20/04/2015 012.0069 ITEM 34 762
- Editado GuSouza segunda-feira, 29 de junho de 2015 13:29
-
1ª coluna - numero gerado
2ª coluna - data
3ª coluna - código do item
4ª coluna - nome do item
5ª coluna - identificador do registro na tabela solicitada
As duas consultas são identicas, só há alteração no "WHERE" de cada uma.
http://luisgustavo12.wordpress.com/
- Editado GuSouza segunda-feira, 29 de junho de 2015 14:08
-
Bom dia,
GuSouza, se as tabelas utilizadas nas consultas são as mesmas, só havendo diferença no Where, talvez seja possível obter o resultado desejado com uma terceira versão do Where.
Se for esse o caso, acho que seria interessante você postar o Where das duas consultas.
Assinatura: http://www.imoveisemexposicao.com.br
-
As duas consultas são identicas, só há alteração no "WHERE" de cada consulta.
5ª coluna - identificador do registro na tabela solicitadaLuís Gustavo, se as duas consultas são idênticas, variando somente na cláusula WHERE, então a quinta coluna pode ser utilizada para identificar as diferenças entre as duas consultas.
Sugiro que use o código 2, substituindo chave pelo nome da coluna que identifica a linha na tabela:
where T2.coluna = T1.coluna
Mas o código 1 também funcionaria...
José Diz Belo Horizonte, MG - Brasil
(Se encontrou a solução nesta resposta, ou se o conteúdo foi útil, lembre-se de marcá-la)
José, mais uma vez Obrigado,
Não posso utilizar essa coluna como comparação, pois a consulta traz dados de outras tabelas, que no sistema seria dados relacionados com esse identificador, e no caso esses "Identificadores" podem conter vários dados relacionados. Então esses identificadores podem repetir varias vezes em ambas colunas, então gostaria de comparar exatamente o resultado (toda a linha) retornado pela consulta, pois não há nenhum dado que eu possa comparar.
http://luisgustavo12.wordpress.com/
-
-
(...) então gostaria de comparar exatamente o resultado (toda a linha) retornado pela consulta, pois não há nenhum dado que eu possa comparar.
Nesse caso me parece que a solução será através do código 1. Observe que a precisão do resultado final depende de que o conteúdo completo de cada linha das subconsultas seja único, sem repetições.
O que é o número gerado para a primeira coluna? Ele depende do que consta na cláusula WHERE?
Poderia transcrever o código da Consulta1 e a cláusula WHERE da Consulta2, para termos uma visão mais completa?
José Diz Belo Horizonte, MG - Brasil
SELECT MOV.NUMERO, CONVERT(VARCHAR(30), MOV.DATA, 103) AS DATA, PRODUTODATABELA.COD AS CODIGO, PRODUTODATABELA AS NOME, MOV.IDENTIFICADOR AS ID FROM ITEM ITEM_POR_MOV INNER JOIN MOV ON ITEM_MOV.IDENTIFICADORMOV = MOV.IDENTIFICADOR INNER JOIN PRODUTODATABELA ON ITEM_MOV.IDPRODUTO = PRODUTODATABELA.IDPRODUTO WHERE MOV.CLIENTE = 001125 AND MOV.TIPOMOV IN ('112A','112B') AND MOV.FILIAL = 4 --SEGUNDA CONSULTA WHERE MOV.CLIENTE = 001125 AND MOV.TIPOMOV IN ('122A') AND MOV.FILIAL = 4
http://luisgustavo12.wordpress.com/
-
GuSouza,
Pelo que entendi podem existir várias linhas na tabela MOV com o mesmo valor na coluna IDENTIFICADOR, mas com um valor diferente na coluna TIPOMOV.
Seria isso mesmo? Caso seja, o valor das colunas NUMERO e DATA também varia ou é sempre igual?
Assinatura: http://www.imoveisemexposicao.com.br
-
-
-
José,
A tabela MOV armazena somente os dados do movimento, existe uma tabela com todos os items envolvidos nos registros da tabela MOV, sendo ela "ITEM_MOV" para um movimento eu posso ter N itens.
Utilizo a cláusula
IN ('112A','112B')
ao invés de:
MOV.TIPOMOV = '112A' OR MOV.TIPOMOV = '112B'
A resposta da pergunta (2) é sim, procuro registros que tem como tipo mov = 112A e 112B e que não existam no tipo de mov 122A, e não necessariamente devem ter as mesmas datas.
Para resposta para a pergunta (4), o NumeroMov não se repete para 112A ou 112B, o mesmo é sequencial.
http://luisgustavo12.wordpress.com/
- Editado GuSouza segunda-feira, 29 de junho de 2015 17:48
-
GuSouza,
Segue uma sugestão para teste:
WITH CTE_MOV AS ( SELECT M.NUMERO, M.DATA, M.IDENTIFICADOR FROM MOV M WHERE M.CLIENTE = 001125 AND M.TIPOMOV IN ('112A', '112B') AND M.FILIAL = 4 AND NOT EXISTS (SELECT 1 FROM MOV S WHERE S.CLIENTE = M.CLIENTE AND S.TIPOMOV = '122A' AND S.FILIAL = M.FILIAL AND S.IDENTIFICADOR = M.IDENTIFICADOR) ) SELECT MOV.NUMERO, CONVERT(VARCHAR(30), MOV.DATA, 103) AS DATA, PRODUTODATABELA.COD AS CODIGO, PRODUTODATABELA.PRODUTO AS NOME, MOV.IDENTIFICADOR AS ID FROM CTE_MOV MOV INNER JOIN ITEM ITEM_MOV ON ITEM_MOV.IDENTIFICADORMOV = MOV.IDENTIFICADOR INNER JOIN PRODUTODATABELA ON ITEM_MOV.IDPRODUTO = PRODUTODATABELA.IDPRODUTO
Espero que ajude.
Assinatura: http://www.imoveisemexposicao.com.br