none
TRAZER REGISTROS QUE TEM EM UMA TABELA E NÃO ESTA EM OUTRA RRS feed

  • Pergunta

  • Boa tarde!

    Gostaria de saber como posso fazer para trazer registros que existe em uma tabela e nao existe em outra.


    A tabela SD1 possui os campos filial , doc. serie, fornece, loja e a data já  SDE possui apenas os campos s filial , doc. serie, fornece, loja.

    Tentei da seguinte forma porem ainda nao consegui.

    SELECT  C.D1_FILIAL, C.D1_DOC, C.D1_SERIE, C.D1_FORNECE, C.D1_LOJA                      '01' AS EMPRESA
    FROM         dadosadv10.dbo.SD1010 AS C
    WHERE     (C.D1_DTDIGIT = '20161117') AND  (D_E_L_E_T_ <> '*') 
    GROUP BY C.D1_FILIAL, C.D1_DOC, C.D1_SERIE, C.D1_FORNECE, C.D1_LOJA
    EXCEPT /*MENOS*/
    SELECT  D.DE_FILIAL, D.DE_DOC, D.DE_SERIE, D.DE_FORNECE, D.DE_LOJA, 
                          '01' AS EMPRESA
    FROM         dadosadv10.dbo.SDE010 AS D
    WHERE     (D_E_L_E_T_ <> '*')  
    GROUP BY D.DE_FILIAL, D.DE_DOC, D.DE_SERIE, D.DE_FORNECE, D.DE_LOJA

    Alguem pode me ajuar?

    quinta-feira, 17 de novembro de 2016 16:17

Respostas

  • carine.couto

    Tente assim:

    SELECT  C.D1_FILIAL, C.D1_DOC, C.D1_SERIE, C.D1_FORNECE, C.D1_LOJA                      '01' AS EMPRESA
    FROM         dadosadv10.dbo.SD1010 AS C
    WHERE     (C.D1_DTDIGIT = '20161117') AND  (D_E_L_E_T_ <> '*') AND 
    NOT EXISTS(SELECT  D.DE_FILIAL
    FROM         dadosadv10.dbo.SDE010 AS D
    WHERE     (D_E_L_E_T_ <> '*') AND  C.D1_FILIAL = D.DE_FILIAL AND C.D1_DOC = D.DE_DOC 
    AND C.D1_SERIE = D.DE_SERIE
    AND C.D1_FORNECE = D.DE_FORNECE
    AND C.D1_LOJA = D.DE_LOJA
    )
    GROUP BY C.D1_FILIAL, C.D1_DOC, C.D1_SERIE, C.D1_FORNECE, C.D1_LOJA

    Como não sei quais campos devem ser considerados ao comparar o conteúdo das duas tabelas, coloquei todos do select original na tabela SDE.


    If you found this post helpful, please "Vote as Helpful". If it actually answered your question, remember to "Mark as Answer".

    Se achou este post útil, por favor clique em "Votar como útil". Se por acaso respondeu sua dúvida, lembre de "Marcar como Resposta".


    quinta-feira, 17 de novembro de 2016 16:53
  • Vc pode fazer com LEFT JOIN ou tambem com NOT  EXISTS 

    nesse caso especifico acredito que seje melhor o NOT EXISTS  segue um exemplo 

    SELECT  ProjecaoA.EMPRESA
    FROM    ( SELECT    C.D1_FILIAL ,
                        C.D1_DOC ,
                        C.D1_SERIE ,
                        C.D1_FORNECE ,
                        C.D1_LOJA ,
                        '01' AS EMPRESA
              FROM      dadosadv10.dbo.SD1010 AS C
              WHERE     ( C.D1_DTDIGIT = '20161117' )
                        AND ( D_E_L_E_T_ <> '*' )
              GROUP BY  C.D1_FILIAL ,
                        C.D1_DOC ,
                        C.D1_SERIE ,
                        C.D1_FORNECE ,
                        C.D1_LOJA
            ) AS ProjecaoA
    WHERE   NOT EXISTS ( SELECT 1
                         FROM   dadosadv10.dbo.SDE010 AS D
                         WHERE  ( D_E_L_E_T_ <> '*' )
                                AND D.DE_FILIAL = ProjecaoA.D1_FILIAL
                                AND D.DE_DOC = ProjecaoA.DE_DOC
                                AND D.DE_SERIE = ProjecaoA.DE_SERIE
                                AND D.DE_FORNECE = ProjecaoA.DE_FORNECE )
    GROUP BY ProjecaoA.DE_FILIAL ,
            ProjecaoA.DE_DOC ,
            ProjecaoA.DE_SERIE ,
            ProjecaoA.DE_FORNECE ,
            ProjecaoA.DE_LOJA;

    Agora , sua query do EXCEPT aparentemente está correta, entretanto seus GROUP BY são desnecessários pois seu retorno do SELECT não tem Funções de agregação

    antes de ver meu exemplo roda sua query assim

    SELECT  C.D1_FILIAL ,
            C.D1_DOC ,
            C.D1_SERIE ,
            C.D1_FORNECE ,
            C.D1_LOJA ,
            '01' AS EMPRESA
    FROM    dadosadv10.dbo.SD1010 AS C
    WHERE   ( C.D1_DTDIGIT = '20161117' )
            AND ( D_E_L_E_T_ <> '*' )
    EXCEPT /*MENOS*/
    SELECT  D.DE_FILIAL ,
            D.DE_DOC ,
            D.DE_SERIE ,
            D.DE_FORNECE ,
            D.DE_LOJA ,
            '01' AS EMPRESA
    FROM    dadosadv10.dbo.SDE010 AS D
    WHERE   ( D_E_L_E_T_ <> '*' )


    Wesley Neves


    • Editado Wesley Neves quinta-feira, 17 de novembro de 2016 16:54 correção
    • Marcado como Resposta carine.couto quinta-feira, 17 de novembro de 2016 17:42
    quinta-feira, 17 de novembro de 2016 16:53

Todas as Respostas

  • carine.couto

    Tente assim:

    SELECT  C.D1_FILIAL, C.D1_DOC, C.D1_SERIE, C.D1_FORNECE, C.D1_LOJA                      '01' AS EMPRESA
    FROM         dadosadv10.dbo.SD1010 AS C
    WHERE     (C.D1_DTDIGIT = '20161117') AND  (D_E_L_E_T_ <> '*') AND 
    NOT EXISTS(SELECT  D.DE_FILIAL
    FROM         dadosadv10.dbo.SDE010 AS D
    WHERE     (D_E_L_E_T_ <> '*') AND  C.D1_FILIAL = D.DE_FILIAL AND C.D1_DOC = D.DE_DOC 
    AND C.D1_SERIE = D.DE_SERIE
    AND C.D1_FORNECE = D.DE_FORNECE
    AND C.D1_LOJA = D.DE_LOJA
    )
    GROUP BY C.D1_FILIAL, C.D1_DOC, C.D1_SERIE, C.D1_FORNECE, C.D1_LOJA

    Como não sei quais campos devem ser considerados ao comparar o conteúdo das duas tabelas, coloquei todos do select original na tabela SDE.


    If you found this post helpful, please "Vote as Helpful". If it actually answered your question, remember to "Mark as Answer".

    Se achou este post útil, por favor clique em "Votar como útil". Se por acaso respondeu sua dúvida, lembre de "Marcar como Resposta".


    quinta-feira, 17 de novembro de 2016 16:53
  • Vc pode fazer com LEFT JOIN ou tambem com NOT  EXISTS 

    nesse caso especifico acredito que seje melhor o NOT EXISTS  segue um exemplo 

    SELECT  ProjecaoA.EMPRESA
    FROM    ( SELECT    C.D1_FILIAL ,
                        C.D1_DOC ,
                        C.D1_SERIE ,
                        C.D1_FORNECE ,
                        C.D1_LOJA ,
                        '01' AS EMPRESA
              FROM      dadosadv10.dbo.SD1010 AS C
              WHERE     ( C.D1_DTDIGIT = '20161117' )
                        AND ( D_E_L_E_T_ <> '*' )
              GROUP BY  C.D1_FILIAL ,
                        C.D1_DOC ,
                        C.D1_SERIE ,
                        C.D1_FORNECE ,
                        C.D1_LOJA
            ) AS ProjecaoA
    WHERE   NOT EXISTS ( SELECT 1
                         FROM   dadosadv10.dbo.SDE010 AS D
                         WHERE  ( D_E_L_E_T_ <> '*' )
                                AND D.DE_FILIAL = ProjecaoA.D1_FILIAL
                                AND D.DE_DOC = ProjecaoA.DE_DOC
                                AND D.DE_SERIE = ProjecaoA.DE_SERIE
                                AND D.DE_FORNECE = ProjecaoA.DE_FORNECE )
    GROUP BY ProjecaoA.DE_FILIAL ,
            ProjecaoA.DE_DOC ,
            ProjecaoA.DE_SERIE ,
            ProjecaoA.DE_FORNECE ,
            ProjecaoA.DE_LOJA;

    Agora , sua query do EXCEPT aparentemente está correta, entretanto seus GROUP BY são desnecessários pois seu retorno do SELECT não tem Funções de agregação

    antes de ver meu exemplo roda sua query assim

    SELECT  C.D1_FILIAL ,
            C.D1_DOC ,
            C.D1_SERIE ,
            C.D1_FORNECE ,
            C.D1_LOJA ,
            '01' AS EMPRESA
    FROM    dadosadv10.dbo.SD1010 AS C
    WHERE   ( C.D1_DTDIGIT = '20161117' )
            AND ( D_E_L_E_T_ <> '*' )
    EXCEPT /*MENOS*/
    SELECT  D.DE_FILIAL ,
            D.DE_DOC ,
            D.DE_SERIE ,
            D.DE_FORNECE ,
            D.DE_LOJA ,
            '01' AS EMPRESA
    FROM    dadosadv10.dbo.SDE010 AS D
    WHERE   ( D_E_L_E_T_ <> '*' )


    Wesley Neves


    • Editado Wesley Neves quinta-feira, 17 de novembro de 2016 16:54 correção
    • Marcado como Resposta carine.couto quinta-feira, 17 de novembro de 2016 17:42
    quinta-feira, 17 de novembro de 2016 16:53
  • Obrigada!

    Das duas maneiras deram certo!

    quinta-feira, 17 de novembro de 2016 17:42
  • Muito Obrigada!

    Deu certo!

    quinta-feira, 17 de novembro de 2016 17:43