none
Trazer dados diferentes entre resultado de duas consultas RRS feed

  • 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/

    segunda-feira, 29 de junho de 2015 12:14

Respostas

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.

     

    segunda-feira, 29 de junho de 2015 12:25
  • 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"

    segunda-feira, 29 de junho de 2015 12:32
    Moderador
  • 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/

    segunda-feira, 29 de junho de 2015 12:53
  • 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
    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
    segunda-feira, 29 de junho de 2015 14:07
  • 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

    segunda-feira, 29 de junho de 2015 14:28
  • As duas consultas são identicas, só há alteração no "WHERE" de cada consulta.
    5ª coluna - identificador do registro na tabela solicitada

    Luí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/

    segunda-feira, 29 de junho de 2015 14:30
  • Também pode ocorrer da consulta retornar basicamente registros "Idênticos" alterando apenas os dados referentes ao Produto.

    http://luisgustavo12.wordpress.com/

    segunda-feira, 29 de junho de 2015 14:36
  • (...) 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/

    segunda-feira, 29 de junho de 2015 14:52
  • 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

    segunda-feira, 29 de junho de 2015 15:12
  • Por questões de segurança, executei alterações para nomes "Genericos".

    http://luisgustavo12.wordpress.com/

    segunda-feira, 29 de junho de 2015 15:33
  • e identificador é gerado assim que o cadastro desse mov. é feito, o numero mov é gerado depois de executar tal procedimento.

    http://luisgustavo12.wordpress.com/

    segunda-feira, 29 de junho de 2015 16:44
  • 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
    segunda-feira, 29 de junho de 2015 17:45
  • 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

    segunda-feira, 29 de junho de 2015 18:22