Ir para conteúdo
Anúncios Publicitários
lucas1985

Em duplicidade SQL

Recommended Posts

Boa tarde!

Gostaria de contar com a ajuda de vcs novamente, tenho uma SQL montada, só que ela esta puxando alguns lançamentos em duplicidades, seria possível vcs me ajudarem a corrigir para não vir lançamentos em duplicidade.

Em anexo arquivo txt com a SQL

 

 

RMfiscal.txt

Compartilhar este post


Link para o post
Compartilhar em outros sites

usa a função distinct

SELECT [ ALL | DISTINCT ]  
[ TOP ( expression ) [ PERCENT ] [ WITH TIES ] ]   
<select_list>  

ALL
Especifica que linhas duplicadas podem aparecer no conjunto de resultados. 
ALL é o padrão.
DISTINCT
Especifica que só linhas exclusivas podem aparecer no conjunto de resultados. 
Valores nulos são considerados iguais para os propósitos
da palavra-chave DISTINCT.

O par de colchetes no trecho [ ALL | DISTINCT ] indica que os dois argumentos são opcionais e que se informados são mutuamente exclusivos, isto é, ou um ou outro. Como consta na documentação o argumento ALL é o padrão, ou seja, se nenhum dos argumentos constar do comando, assume-se a presença de ALL. A respeito do argumento DISTINCT a documentação cita linhas exclusivas, entende-se por valores não repetidos.

Editado por omar

Compartilhar este post


Link para o post
Compartilhar em outros sites

Excelente tarde, Omar!

Coloquei o DISTINCT, não sei se estou fazendo certo, mas continua puxando em duplicidade.

Veja imagem em anexo

Resultado.jpg

Select.jpg

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa tarde Lucas!

Pelo que vi, a sua consulta não está vindo duplicada, pois os demais campos da tabela são diferentes, como na coluna VALORCONT.

A função DISTINCT irá mesclar as células que possuem todas as linhas iguais.

Por exemplo, se uma tabela traz dois registros com duas colunas iguais, como abaixo:

Código - (SELECT NOME, CIDADE FROM GFILIAL WHERE NOME = 'FJN')

NOME CIDADE
FJN JUAZEIRO
FJN JUAZEIRO

e você usar um DISTINCT, como abaixo:

Código - (SELECT DISTINCT NOME, CIDADE FROM GFILIAL WHERE NOME = 'FJN')

Ficará apenas um registro.

NOME CIDADE
FJN JUAZEIRO

 

  • Like 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Também na data de entrada são informações diferentes.

  • Like 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia! Esse mesmo fornecedor tenho ele na coligada 2, mesmo colocando para puxar a coligada 1 puxa em duplicidade, se vc observar os documentos são os mesmos números, id e mesmas datas de entrada.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Remove os selects internos e veja se continua duplicado. 

Caso não apareçam duplicados, o problema ocorre por causa dos selects internos.    Vc tem certeza que não existem colunas com valores diferentes ?

Editado por omar

Compartilhar este post


Link para o post
Compartilhar em outros sites
17 horas atrás, omar disse:

Remove os selects internos e veja se continua duplicado. 

Caso não apareçam duplicados, o problema ocorre por causa dos selects internos.    Vc tem certeza que não existem colunas com valores diferentes ?

Bom dia! Não tem valores diferentes.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Lucas, você tem alguns problemas estruturais na sua sentença... que podem gerar seu problema, bem como pode causar o retorno de informações erradas, e até deixar a sentença mais lenta. 

INNER JOIN FCFO (nolock) ON 
    (FCFO.CODCFO=DLAF.EMITENTECFO OR FCFO.CODCFO=DLAF.CODCFOORIGEMDESTINO)
    AND FCFO.CODCOLIGADA=DLAF.CODCOLCFO

-- ESSA PARTE ACIMA VC TEM QUE POR, MESMO QUE SEUS CLIFOR SEJAM GLOBAIS. E SE NÃO FOR, PIOR... AI ESTÁ ERRADO MESMO... E JÁ QUE ESTÁ USANDO OR NA LINHA ACIMA, TEVE QUE COLOCAR PARENTESIS TAMBÉM... 

EM nenhum SUBSELECT seu você trata CodColigada... tem que tratar. Isso é um erro, e repito o que falei acima. 

Exemplo (parte...):

    (select DTRBITEM.CODTRB FROM DTRBITEM 
        where DTRBITEM.CODTRB='PIS' AND
            DTRBITEM.IDLAF=DITEM.IDLAF AND DTRBITEM.CODCOLIGADA=DITEM.CODCOLIGADA AND
             DTRBITEM.NUMITEM=DITEM.NUMITEM) [PIS],
    (select DTRBITEM.BASETRB FROM DTRBITEM 
        where DTRBITEM.CODTRB='PIS' AND 
         DTRBITEM.IDLAF=DITEM.IDLAF AND
        DTRBITEM.NUMITEM=DITEM.NUMITEM) [BC PIS],

 

INNER JOIN TMOV ON DLAF.IDMOV=TMOV.IDMOV --- CADE O JOIN DE CODCOLIGADA AQUI TAMBEM??

 

Por ultimo, veja ao retornarem os dados, se realmente não está vindo nada de diferente na consulta, pois, o DISTINCT apenas traz um registro quando há uma repetição completa da linha de retorno. Se uma vírgula for diferente ele mostra as duas ou mais linhas. 

  • Like 2

Compartilhar este post


Link para o post
Compartilhar em outros sites
1 hora atrás, Jair - Fórmula disse:

Lucas, você tem alguns problemas estruturais na sua sentença... que podem gerar seu problema, bem como pode causar o retorno de informações erradas, e até deixar a sentença mais lenta. 

INNER JOIN FCFO (nolock) ON 
    (FCFO.CODCFO=DLAF.EMITENTECFO OR FCFO.CODCFO=DLAF.CODCFOORIGEMDESTINO)
    AND FCFO.CODCOLIGADA=DLAF.CODCOLCFO

-- ESSA PARTE ACIMA VC TEM QUE POR, MESMO QUE SEUS CLIFOR SEJAM GLOBAIS. E SE NÃO FOR, PIOR... AI ESTÁ ERRADO MESMO... E JÁ QUE ESTÁ USANDO OR NA LINHA ACIMA, TEVE QUE COLOCAR PARENTESIS TAMBÉM... 

EM nenhum SUBSELECT seu você trata CodColigada... tem que tratar. Isso é um erro, e repito o que falei acima. 

Exemplo (parte...):

    (select DTRBITEM.CODTRB FROM DTRBITEM 
        where DTRBITEM.CODTRB='PIS' AND
            DTRBITEM.IDLAF=DITEM.IDLAF AND DTRBITEM.CODCOLIGADA=DITEM.CODCOLIGADA AND
             DTRBITEM.NUMITEM=DITEM.NUMITEM) [PIS],
    (select DTRBITEM.BASETRB FROM DTRBITEM 
        where DTRBITEM.CODTRB='PIS' AND 
         DTRBITEM.IDLAF=DITEM.IDLAF AND
        DTRBITEM.NUMITEM=DITEM.NUMITEM) [BC PIS],

 

INNER JOIN TMOV ON DLAF.IDMOV=TMOV.IDMOV --- CADE O JOIN DE CODCOLIGADA AQUI TAMBEM??

 

Por ultimo, veja ao retornarem os dados, se realmente não está vindo nada de diferente na consulta, pois, o DISTINCT apenas traz um registro quando há uma repetição completa da linha de retorno. Se uma vírgula for diferente ele mostra as duas ou mais linhas. 

Excelente tarde, Jair!

Conforme sua explicação funcionou perfeito. Mais uma vez muito obrigado!

Obrigado a todos pela colaboração.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

×

Important Information

Usando este site, você concorda com nossos Termos de Uso.