Usuário com melhor resposta
TRAZER REGISTROS QUE TEM EM UMA TABELA E NÃO ESTA EM OUTRA

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?
Respostas
-
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".
- Editado Juliano Nunes Silva Oliveira quinta-feira, 17 de novembro de 2016 16:54
- Marcado como Resposta carine.couto quinta-feira, 17 de novembro de 2016 17:42
-
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
Todas as Respostas
-
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".
- Editado Juliano Nunes Silva Oliveira quinta-feira, 17 de novembro de 2016 16:54
- Marcado como Resposta carine.couto quinta-feira, 17 de novembro de 2016 17:42
-
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
-
-