Pular para o conteúdo
Visualizando 15 posts - 1 até 15 (de 27 do total)
  • Autor
    Posts
  • #90666
    Tiago_BB
    Participante

      Ola pessoal.

      Tenho um subselect que coloquei um order by nele…

      Prém da o erro: ORA-00907: missing right parenthesis.

      Segue meu subselect:


      (SELECT A.DATA_TAB FROM TAB A WHERE A.DATA_TAB < B.DATA_TAB AND A.FERIADO_TAB = 0 AND ROWNUM = 1 ORDER BY A.DATA_TAB DESC)

      Alguém pode me ajudar?

      No sql funciona normalmente.

      Atte.[/quote]

      #90669
      hudsona
      Participante

        Qual a consulta inteira ?

        #90670
        Avatar photoLeonardo Litz
        Participante

          Thiago, este select esta em uma subselect ou é somente ela?

          Se for somente ela, tire os parentes presentos no inicio e no fim:

          SELECT A.DATA_TAB FROM TAB A WHERE A.DATA_TAB < B.DATA_TAB AND A.FERIADO_TAB = 0 AND ROWNUM = 1 ORDER BY A.DATA_TAB DESC

          Vlw Leonardo Litz

          #90671
          Tiago_BB
          Participante


            SELECT * FROM (SELECT
            CASE WHEN (FERIADO_TAB = 1 OR FERIADO_TAB = 2)
            THEN (SELECT A.DATA_TAB FROM TAB A WHERE A.DATA_TAB < B.DATA_TAB AND A.FERIADO_TAB = 0 AND ROWNUM = 1 ORDER BY A.DATA_TAB DESC)
            ELSE
            DATA_TAB END
            FROM TABB
            WHERE CENTRO_CUSTO_TAB = 30001
            AND DATA_TAB < '20090422'
            AND DIA_SEMANA_TAB = 2
            ORDER BY DATA_TAB DESC)
            WHERE ROWNUM = 1

            Obrigado pelo interesse!

            #90672
            Avatar photoLeonardo Litz
            Participante

              Tente assim:

              SELECT *
              FROM (SELECT CASE
              WHEN (FERIADO_TAB = 1 OR FERIADO_TAB = 2) THEN
              (SELECT *
              FROM(SELECT A.DATA_TAB
              FROM TAB A
              WHERE A.DATA_TAB < B.DATA_TAB
              AND A.FERIADO_TAB = 0
              AND ROWNUM = 1
              ORDER BY A.DATA_TAB DESC))
              ELSE
              DATA_TAB
              END
              FROM TABB
              WHERE CENTRO_CUSTO_TAB = 30001
              AND DATA_TAB < '20090422'
              AND DIA_SEMANA_TAB = 2
              ORDER BY DATA_TAB DESC)
              WHERE ROWNUM = 1

              Só uma coisa, creio que vc queira trazer o ultimo regristro da tabela, como o rownum esta antes do order by, neste caso voce nao vai trazer o ultimo. Faça assim


              select *
              FROM(SELECT A.DATA_TAB
              FROM TAB A
              WHERE A.DATA_TAB < B.DATA_TAB
              AND A.FERIADO_TAB = 0
              ORDER BY A.DATA_TAB DESC) a

                 where rownum &lt; 2</code>
              

              Desta forma trará apenas o ultimo registro da tabela.

              Vlw Leonardo Litz

              #90673
              hudsona
              Participante

                [quote=”Litz”:bmhg44m6]Thiago, este select esta em uma subselect ou é somente ela?

                Se for somente ela, tire os parentes presentos no inicio e no fim:

                SELECT A.DATA_TAB FROM TAB A WHERE A.DATA_TAB < B.DATA_TAB AND A.FERIADO_TAB = 0 AND ROWNUM = 1 ORDER BY A.DATA_TAB DESC

                Vlw Leonardo Litz[/quote]

                Thiago

                Esse alias “b” ta no local certo ?

                SELECT A.DATA_TAB FROM TAB A WHERE A.DATA_TAB < B.DATA_TAB AND A.FERIADO_TAB = 0 AND ROWNUM = 1 ORDER BY A.DATA_TAB DESC

                Att

                #90674
                Tiago_BB
                Participante

                  Fiz da forma sugerida:


                  SELECT *
                  FROM (SELECT CASE
                  WHEN (FERIADO_TAB = 1 OR FERIADO_TAB = 2) THEN
                  (SELECT *
                  FROM(SELECT A.DATA_TAB
                  FROM TAB A
                  WHERE A.DATA_TAB < B.DATA_TAB
                  AND A.FERIADO_TAB = 0
                  AND ROWNUM = 1
                  ORDER BY A.DATA_TAB DESC))
                  ELSE
                  DATA_TAB
                  END
                  FROM TABB
                  WHERE CENTRO_CUSTO_TAB = 30001
                  AND DATA_TAB < '20090422'
                  AND DIA_SEMANA_TAB = 2
                  ORDER BY DATA_TAB DESC)
                  WHERE ROWNUM = 1

                  Mas da o erro: ORA-00904: “B”.”DATA_TAB”: invalid identifier no trecho em negrito (linha 7)

                  😕 [/quote]

                  #90675
                  rwarstat
                  Participante

                    Deu o erro de invalid identifier por que tu tá usando um alias de tabela para definir o campo, mas não tem nenhuma tabela com alias B.

                    #90676
                    Avatar photoLeonardo Litz
                    Participante

                      No from o nome da tabela esta TABB é isso mesmo?
                      Não seria TAB B

                      Vlw Leonardo Litz

                      #90677
                      Tiago_BB
                      Participante

                        Sim.. é TAB B.

                        Erro de digitação!!!

                        Conforme demonstrado acima tentei da seguinte forma:


                        SELECT *
                        FROM (SELECT CASE
                        WHEN (FERIADO_TAB = 1 OR FERIADO_TAB = 2) THEN
                        (SELECT *
                        FROM(SELECT A.DATA_TAB
                        FROM TAB A
                        WHERE A.DATA_TAB < B.DATA_TAB
                        AND A.FERIADO_TAB = 0
                        AND ROWNUM = 1
                        ORDER BY A.DATA_TAB DESC))
                        ELSE
                        DATA_TAB
                        END
                        FROM TABB
                        WHERE CENTRO_CUSTO_TAB = 30001
                        AND DATA_TAB < '20090422'
                        AND DIA_SEMANA_TAB = 2
                        ORDER BY DATA_TAB DESC)
                        WHERE ROWNUM = 1

                        Mas da o erro: ORA-00904: “B”.”DATA_TAB”: invalid identifier no trecho em negrito (linha 7)

                        Agradeço o interesse de todos!!!

                        #90678
                        hudsona
                        Participante

                          Tiago_BBn[quote]Sim.. é TAB B.

                          Erro de digitação!!!

                          Conforme demonstrado acima tentei da seguinte forma:


                          SELECT *
                          FROM (SELECT CASE
                          WHEN (FERIADO_TAB = 1 OR FERIADO_TAB = 2) THEN
                          (SELECT *
                          FROM(SELECT A.DATA_TAB
                          FROM TAB A
                          WHERE A.DATA_TAB < B.DATA_TAB
                          AND A.FERIADO_TAB = 0
                          AND ROWNUM = 1
                          ORDER BY A.DATA_TAB DESC))
                          ELSE
                          DATA_TAB
                          END
                          FROM TABB
                          WHERE CENTRO_CUSTO_TAB = 30001
                          AND DATA_TAB < '20090422'
                          AND DIA_SEMANA_TAB = 2
                          ORDER BY DATA_TAB DESC)
                          WHERE ROWNUM = 1

                          Mas da o erro: ORA-00904: “B”.”DATA_TAB”: invalid identifier no trecho em negrito (linha 7)

                          Mas é isso!!

                          Você esta usando um alias b e não esta referenciando nenhuma tabela para esse alias.

                          SELECT A.DATA_TAB FROM TAB A,TAB B WHERE A.DATA_TAB < B.DATA_TAB AND A.FERIADO_TAB = 0 AND ROWNUM = 1 ORDER BY A.DATA_TAB DESC

                          Você precisa referenciar a tabela para esse alias b.

                          #90679
                          Tiago_BB
                          Participante

                            Entaum…
                            Referente a esse trecho:


                            WHERE A.DATA_TAB < B.DATA_TAB

                            Esse B.DATA_TAB é referente ao FROM TAB B desse trecho final:


                            .
                            .
                            .
                            FROM TABB
                            WHERE CENTRO_CUSTO_TAB = 30001
                            AND DATA_TAB < '20090422'
                            AND DIA_SEMANA_TAB = 2
                            ORDER BY DATA_TAB DESC)
                            WHERE ROWNUM = 1

                            #90680
                            Tiago_BB
                            Participante

                              CORRIGINDO?


                              .
                              .
                              .
                              FROM TAB B
                              WHERE CENTRO_CUSTO_TAB = 30001
                              AND DATA_TAB < '20090422'
                              AND DIA_SEMANA_TAB = 2
                              ORDER BY DATA_TAB DESC)
                              WHERE ROWNUM = 1

                              #90681
                              Tiago_BB
                              Participante

                                Pessoal.

                                Fiz e funcionou… não sei se é a melhor maneira

                                Ficou assim:


                                SELECT *
                                FROM (SELECT CASE
                                WHEN (FERIADO_TAB = 1 OR FERIADO_TAB = 2) THEN
                                (SELECT *
                                FROM(SELECT A.DATA_TAB
                                FROM TAB A, TAB B
                                WHERE A.DATA_TAB < B.DATA_TAB
                                AND A.FERIADO_TAB = 0
                                AND B.CENTRO_CUSTO_TAB = 30001
                                AND B.DATA_TAB < '20090424'
                                AND B.DIA_SEMANA_TAB = 2
                                AND ROWNUM = 1
                                ORDER BY A.DATA_TAB DESC))
                                ELSE
                                DATA_TAB
                                END
                                FROM TAB B
                                WHERE CENTRO_CUSTO_TAB = 30001
                                AND DATA_TAB < '20090424'
                                AND DIA_SEMANA_TAB = 2
                                ORDER BY DATA_TAB DESC)
                                WHERE ROWNUM = 1

                                O que vocês acham?

                                😮

                                #90682
                                Avatar photoLeonardo Litz
                                Participante

                                  Só falta fazer o esquema do rownum no order by da subselect que esta no case..
                                  Dá uma olhada no desempenho também.. veja se esta legal…

                                  Vlw Leonardo Litz

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