none
Duplicidade de resultado RRS feed

  • Pergunta

  • Olá amigo,

    Estou com um problema num select que retorna uma lista de COTAÇÕES. Se uso left join ele repete a linha uma cotação para cada CORRETORA. Exemplo, tenho 1 cotação e 3 corretoras ocultaram a cotação, então está listando 3x a mesma cotação.

    Num segundo caso, tentei colocar o select dentro do select, mas o resultado do select não serve como parâmetro no WHERE. Como posso resolver isso?

    Veja abaixo os dois exemplos que tentei:

    DUPLICANDO ->

    SELECT cot.* FROM Cotacao AS cot 
    LEFT JOIN SeguradoVeiculo AS vei ON cot.idObjetoSeguro = vei.id 
    LEFT JOIN veiculoModelo AS mod ON vei.idModelo = mod.id 
    LEFT JOIN veiculomarca AS mar ON mod.idVeiculoMarca = mar.id 
    LEFT JOIN proposta AS pro ON cot.idPropostaAprovada = pro.id 
    LEFT JOIN segurado AS seg ON seg.id = cot.idSegurado 
    LEFT JOIN Cotacao_Corretora AS cc ON cc.idCotacao = cot.id 
    WHERE ( ( (cot.dataTermino >= CONVERT(DATETIME, GETDATE(), 102)) AND (cot.idStatus < 7) ) OR ( (cot.idStatus = 6) AND (pro.idCorretora = 6047) ) ) AND (seg.idStatus = 1) AND (cc.ocultarCotacao = 0)

    NÃO FUNCIONA O WHERE ->

    SELECT cot.*, (SELECT ocultarCotacao FROM Cotacao_Corretora AS cc WHERE cc.idCotacao = cot.id AND cc.idCorretora = 6047) AS ocultarCotacao FROM Cotacao AS cot 
    LEFT JOIN SeguradoVeiculo AS vei ON cot.idObjetoSeguro = vei.id 
    LEFT JOIN veiculoModelo AS mod ON vei.idModelo = mod.id 
    LEFT JOIN veiculomarca AS mar ON mod.idVeiculoMarca = mar.id 
    LEFT JOIN proposta AS pro ON cot.idPropostaAprovada = pro.id 
    LEFT JOIN segurado AS seg ON seg.id = cot.idSegurado 
    WHERE ( ( (cot.dataTermino >= CONVERT(DATETIME, GETDATE(), 102)) AND (cot.idStatus < 7) ) OR ( (cot.idStatus = 6) AND (pro.idCorretora = 6047) ) ) AND (seg.idStatus = 1) AND (ocultarCotacao = 0)

    Desde já, obrigado!


    quarta-feira, 17 de setembro de 2014 15:35

Respostas

  • Olá Pedro Antônio,

    Obrigado pela atenção. Já resolvi!

    Fiz isso: "LEFT JOIN Cotacao_Corretora AS cc ON (cc.idCorretora = " + idCorretora.ToString() + " AND cc.idCotacao = cot.id) "

    Agora não duplica!


    • Marcado como Resposta wcsantos segunda-feira, 22 de setembro de 2014 13:09
    segunda-feira, 22 de setembro de 2014 13:09

Todas as Respostas

  • wcsantos,

    Mas o que acontece? Sinceramente não consegui entender o que você este tendo dificuldade?

    Você esta fazendo diversos Joins utilizando o Left onde os dados necessariamente não precisam existir ou coexistir no relacionamento para attender a sua condição no Where!!!!


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | SoroCódigos] @JuniorGalvaoMVP | pedrogalvaojunior.wordpress.com

    quarta-feira, 17 de setembro de 2014 18:07
  • O que acontece é por causa do Cotacao_Corretora - que é uma tabela de relacionamento mas que guarda outras informações relacionadas diretamente entre ambas - a cada novo relacionamento, se repetia uma linha como resultado da pesquisa.

    Exemplo, se uma corretora ocultasse uma cotação, tudo ficava normal. Mas se duas ocultassem a mesma cotação, retornava duas linhas da mesma cotação por causa desse Join.

    Com relação ao WHERE, na verdade ele é resultado de uma série de filtros que são usados pela corretora para listar as cotações, por isso alguns JOIN estão "perdidos" ai, como citou. Mas dependendo do filtro, a string SQL muda. Por exemplo, ela pode ter AND (cc.ocultarCotacao = 0) ou não!

     
    quarta-feira, 17 de setembro de 2014 18:45
  • wcsantos,

    Então a Cotacao_Corretora é o relacionamento entre Cotacao e outras tables?

    Se for isso, estamos falando de um relacionamento de Muitos para Muitos, onde esta table é o resultado do relacionamento. Sendo isso, o que você terá que analisar é como estão sendo feito a junção dos dados para serem apresentados em na sua query.


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | SoroCódigos] @JuniorGalvaoMVP | pedrogalvaojunior.wordpress.com

    sexta-feira, 19 de setembro de 2014 15:07
  • Olá Pedro Antônio,

    Obrigado pela atenção. Já resolvi!

    Fiz isso: "LEFT JOIN Cotacao_Corretora AS cc ON (cc.idCorretora = " + idCorretora.ToString() + " AND cc.idCotacao = cot.id) "

    Agora não duplica!


    • Marcado como Resposta wcsantos segunda-feira, 22 de setembro de 2014 13:09
    segunda-feira, 22 de setembro de 2014 13:09