Dúvida SQL / confirmação

Forum sobre SQL.

Moderador: Moderadores

Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Dúvida SQL / confirmação

Mensagem por JoséQuintas »

antes o jppreco era DBF
o SELECT trás corretamente o último preço reajustado.

Código: Selecionar todos

   Mensagem( "Anulando reajuste" )
   WITH OBJECT cnSQL
      :cSQL := "SELECT IDPREHIS, PHPRODUTO, PHCADASTRO, PHFORPAG, PHVALOR FROM JPPREHIS" + ;
         " INNER JOIN" + ;
         " ( SELECT MAX( IDPREHIS ) AS ULTIMOLANC FROM JPPREHIS GROUP BY PHPRODUTO, PHCADASTRO, PHFORPAG ) AS ULTIMO" + ;
         " ON JPPREHIS.IDPREHIS = ULTIMO.ULTIMOLANC" + ;
         " ORDER BY PHPRODUTO, PHCADASTRO, PHFORPAG"
      :Execute()
      DO WHILE ! :Eof()
         SELECT jppreco
         SEEK StrZero( :Number( "PHPRODUTO" ), 6 ) + StrZero( :Number( "PHCADASTRO", 6 ) ) + StrZero( :Number( "PHFORPAG" ), 6 )
         IF ! Eof()
            :QueryCreate()
            :QueryAdd( "PCVALOR", :Number( "PHVALOR" ) )
            jppreco->( :DBFQueryExecuteUpdate( "JPPRECO" ) )
            :QueryExecuteUpdate( "JPPRECO", "IDPRECO = " + NumberSQL( jppreco->idPreco ) )
         ENDIF
         :MoveNext()
      ENDDO
      :CloseRecordset()
   ENDWITH
Agora é SQL.
Imaginei: se isso trás certo, basta usar o resultado disso.

Código: Selecionar todos

   Mensagem( "Anulando reajuste" )
   WITH OBJECT cnSQL
      :cSQL := "UPDATE JPPRECO" + ;
         " INNER JOIN ( " + ;
            " SELECT IDPREHIS, PHPRODUTO, PHCADASTRO, PHFORPAG, PHVALOR FROM JPPREHIS" + ;
               " INNER JOIN" + ;
                  " ( SELECT MAX( IDPREHIS ) AS ULTIMOLANC FROM JPPREHIS GROUP BY PHPRODUTO, PHCADASTRO, PHFORPAG ) AS ULTIMO" + ;
            " ON JPPREHIS.IDPREHIS = ULTIMO.ULTIMOLANC ) AS A" + ;
   ;
            " ON A.PHPRODUTO = JPPRECO.PCPRODUTO AND A.PHCADASTRO = JPPRECO.PCCADASTRO" + ;
               " AND A.PHFORPAG = JPPRECO.PCFORPAG" + ;
            " SET JPPRECO.PCVALOR = A.PHVALOR" + ;
            " WHERE A.PHPRODUTO = JPPRECO.PCPRODUTO AND A.PHCADASTRO = JPPRECO.PCCADASTRO AND A.PHFORPAG = JPPRECO.PCFORPAG"
      :ExecuteCmd()
   ENDWITH
A dúvida é se precisa o WHERE quando usa INNER JOIN.
A intenção é não mexer em preços que não existem no histórico.

A chave do preço é produto + cadastro + forma de pagamento

No final o INNER JOIN e o WHERE estão fazendo a mesma coisa exceto que o WHERE impede NULL, e o INNER JOIN "talvez" também.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
Vlademiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 752
Registrado em: 11 Jul 2005 02:46

Dúvida SQL / confirmação

Mensagem por Vlademiro »

O inner só trás se os campos forem iguais. Então o where não precisa.

Agora, se por acaso for relacionar campos nulos use left ou right Join, dependendo da posição do nulo, se esquerda ou direita.
Avatar do usuário
Vlademiro
Usuário Nível 4
Usuário Nível 4
Mensagens: 752
Registrado em: 11 Jul 2005 02:46

Dúvida SQL / confirmação

Mensagem por Vlademiro »

Deixa pra usar where em outros filtros, tipo status=1 ou valcusto > 1000. Where funciona para relacionar mas não é aconselhado.
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Dúvida SQL / confirmação

Mensagem por JoséQuintas »

Vlademiro escreveu:Where funciona para relacionar mas não é aconselhado.
Já tive a impressão de que usando where é feita uma multiplicação.
Tipo 1000 registros contra 1000 registros, ao invés de 1 x 1

Mas valeu.

E por falar nisso... terminei o cadastro que faltava pra poder conferir isso, e esqueci de conferir kkkkk
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Responder