Página 1 de 1

Dúvida SQL / confirmação

Enviado: 16 Jul 2020 15:10
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.

Dúvida SQL / confirmação

Enviado: 16 Jul 2020 18:20
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.

Dúvida SQL / confirmação

Enviado: 16 Jul 2020 18:25
por Vlademiro
Deixa pra usar where em outros filtros, tipo status=1 ou valcusto > 1000. Where funciona para relacionar mas não é aconselhado.

Dúvida SQL / confirmação

Enviado: 16 Jul 2020 19:16
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