Pular para o conteúdo
Visualizando 12 posts - 1 até 12 (de 12 do total)
  • Autor
    Posts
  • #102287
    Avatar de italocloneitaloclone
    Participante

      Colegas,

      segue select:


      SELECT CAB.CODEMP EMP,
      CAB.NUMNOTA || CAB.SERIENOTA || CAB.VLRNOTA VALIDADOR,
      EMP.CGC CNPJ_ORIGEM,
      EMP.NOMEFANTASIA,
      PAR.NOMEPARC DESTINO,
      PAR.CGC_CPF CNPJ_DESTINO,
      CAB.NUMNOTA NOTA,
      CAB.NUNOTA nunota,
      CAB.SERIENOTA SERIE,
      CAB.DTNEG,
      CAB.VLRNOTA VALOR,
      CAB.CODTIPOPER TOP
      FROM TGFCAB CAB,
      TGFPAR PAR,
      TSIEMP EMP
      WHERE CAB.SERIENOTA <> 'D' AND
      CAB.SERIENOTA <> 'CF' AND
      CAB.DTNEG >= '01/11/2011' AND
      CAB.DTNEG <= '30/11/2011' AND ( CAB.CODPARC = 43 OR CAB.CODPARC = 44 OR CAB.CODPARC = 45 OR CAB.CODPARC = 46 OR CAB.CODPARC = 47 OR CAB.CODPARC = 48 OR CAB.CODPARC = 49 OR CAB.CODPARC = 50 OR CAB.CODPARC = 51 OR CAB.CODPARC = 52 OR CAB.CODPARC = 53 OR CAB.CODPARC = 54 OR CAB.CODPARC = 55 OR CAB.CODPARC = 56 OR CAB.CODPARC = 57 OR CAB.CODPARC = 58 OR CAB.CODPARC = 60 OR CAB.CODPARC = 61 OR CAB.CODPARC = 62 OR CAB.CODPARC = 63 OR CAB.CODPARC = 64 OR CAB.CODPARC = 65 OR CAB.CODPARC = 66 OR CAB.CODPARC = 67 OR CAB.CODPARC = 68 OR CAB.CODPARC = 69 OR CAB.CODPARC = 70 OR CAB.CODPARC = 453 OR CAB.CODPARC = 215 ) AND CAB.CODPARC = PAR.CODPARC AND CAB.CODEMP = EMP.CODEMP ORDER BY VALIDADOR

      A coluna VALIDADOR eu criei para diferenciar os resultados, eu não quero que apareça resultado VALIDADOR repetido,
      Como não conheço tanto assim de sql tentei usar o Distinct e não conseguei

      #102289
      Avatar de rmanrman
      Participante

        @italoclone

        Como está o relacionamento das tabelas TGFCAB com a TGFPAR e TSIEMP ? 1 para N ? Provavelmente seja, talvez com subselect.

        Se for 1 pra 1, deve estar faltando ligação entre as tabelas.

        #102290
        Avatar de italocloneitaloclone
        Participante

          [quote=”rman”:jmj5fln9]@italoclone

          Como está o relacionamento das tabelas TGFCAB com a TGFPAR e TSIEMP ? 1 para N ? Provavelmente seja, talvez com subselect.

          Se for 1 pra 1, deve estar faltando ligação entre as tabelas.[/quote]

          Quando uso o select abaixo consigo o resultado que quero porem preciso de mais informações.


          SELECT DISTINCT CAB.NUMNOTA
          FROM TGFCAB CAB,
          TGFPAR PAR,
          TSIEMP EMP
          WHERE CAB.SERIENOTA 'D' AND
          CAB.SERIENOTA 'CF' AND
          CAB.DTNEG >= '01/11/2011' AND
          CAB.DTNEG <= '30/11/2011' AND
          (
          CAB.CODPARC = 43 OR
          CAB.CODPARC = 44 OR
          CAB.CODPARC = 45 OR
          CAB.CODPARC = 46 OR
          CAB.CODPARC = 47 OR
          CAB.CODPARC = 48 OR
          CAB.CODPARC = 49 OR
          CAB.CODPARC = 50 OR
          CAB.CODPARC = 51 OR
          CAB.CODPARC = 52 OR
          CAB.CODPARC = 53 OR
          CAB.CODPARC = 54 OR
          CAB.CODPARC = 55 OR
          CAB.CODPARC = 56 OR
          CAB.CODPARC = 57 OR
          CAB.CODPARC = 58 OR
          CAB.CODPARC = 60 OR
          CAB.CODPARC = 61 OR
          CAB.CODPARC = 62 OR
          CAB.CODPARC = 63 OR
          CAB.CODPARC = 64 OR
          CAB.CODPARC = 65 OR
          CAB.CODPARC = 66 OR
          CAB.CODPARC = 67 OR
          CAB.CODPARC = 68 OR
          CAB.CODPARC = 69 OR
          CAB.CODPARC = 70 OR
          CAB.CODPARC = 453 OR
          CAB.CODPARC = 215
          ) AND
          CAB.CODPARC = PAR.CODPARC AND
          CAB.CODEMP = EMP.CODEMP

          #102292
          Avatar photoRegis Araujo
          Participante

            Opa.. boa tarde..!

            Bom.. não entendi muito a sua solicitação..

            Mas como q vc fez o distinct?

            Faça um group by então..

            É como o rman falou, se a relação das tabelas for 1->N realmente vc poderá ter alguns valores repitidos… Assim o group by vai ajuda-lo.

            Abraços..!

            #102293
            Avatar de msantinomsantino
            Participante

              @italoclone,

              Você não pode substituir essa série de “CAB.CODPARC = XX OR” pelo IN() ?

              Ficaria assim:
              SELECT DISTINCT CAB.NUMNOTA
              FROM TGFCAB CAB,
              TGFPAR PAR,
              TSIEMP EMP
              WHERE CAB.SERIENOTA 'D' AND
              CAB.SERIENOTA 'CF' AND
              CAB.DTNEG >= '01/11/2011' AND
              CAB.DTNEG <= '30/11/2011' AND
              CAB.CODPARC IN (43, 44, 45, 46, 47,48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 453, 215) AND
              CAB.CODPARC = PAR.CODPARC AND
              CAB.CODEMP = EMP.CODEMP

              mais fácil de ler e de manter, não?

              #102294
              Avatar de rmanrman
              Participante

                @msantino

                Pelo que eu percebi, essa sequencia de OR deve ser gerado dinamicamente na aplicação, por isso que ele não deve ter usado o IN.

                Outro detalhe que muito não sabem, existe um limite de itens dentro do IN.

                #102296
                Avatar de msantinomsantino
                Participante

                  @rman,

                  Sim, existe limite dentro do IN, mas se for uma parada controlada aonde sabe-se que não chegará perto desse limite, acho que vale a pena usar.

                  E mesmo dinamicamente, quando você recebe a lista de valores pode dar um split com “,” e tacar dentro dos parênteses. Lembro que na época que eu era programador e fazia esse tipo de filtros dinâmicos o IN era uma ferramenta ótima!

                  #102298
                  Avatar photoRegis Araujo
                  Participante

                    Opa..!

                    O limite no IN é de 999 registros separados por , (virgula).

                    Abraços..!

                    #102316
                    Avatar de diegolenhardtdiegolenhardt
                    Participante

                      o IN destroi a performance,

                      uma solucao seria um temporary table,
                      onde voce preenche com os valores que tu quer, e relaciona ela na query..

                      🙂

                      #102320
                      Avatar de rmanrman
                      Participante

                        @diegolenhardt

                        Usar uma temporary table em vez do IN com 999 itens o ganho realmente é notório ?

                        #102321
                        Avatar de diegolenhardtdiegolenhardt
                        Participante

                          não depende da quantidade de argumentos do IN,

                          e sim do tamanho da sua tabela onde será pesquisada…

                          ¬¬

                          o IN não vai usar indexes, e com o temporary vai…

                          ai a diferença..

                          #102322
                          Avatar de rmanrman
                          Participante

                            @diegolenhardt

                            Fiz um teste simples utilizando IN sobre o índice de uma PK e usou índice. 😯

                          Visualizando 12 posts - 1 até 12 (de 12 do total)
                          • Você deve fazer login para responder a este tópico.
                          plugins premium WordPress