Clipper On Line • Ver Tópico - Dúvida SQL / confirmação

Dúvida SQL / confirmação

Discussão sobre SQL

Moderador: Moderadores

 

Dúvida SQL / confirmação

Mensagempor JoséQuintas » 16 Jul 2020 15:10

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

   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.

   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, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes

Dúvida SQL / confirmação

Mensagempor Vlademiro » 16 Jul 2020 18:20

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 de usuário

Vlademiro
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 749
Data de registro: 11 Jul 2005 02:46
Curtiu: 22 vezes
Mens.Curtidas: 62 vezes

Dúvida SQL / confirmação

Mensagempor Vlademiro » 16 Jul 2020 18:25

Deixa pra usar where em outros filtros, tipo status=1 ou valcusto > 1000. Where funciona para relacionar mas não é aconselhado.
Avatar de usuário

Vlademiro
Usuário Nível 4

Usuário Nível 4
 
Mensagens: 749
Data de registro: 11 Jul 2005 02:46
Curtiu: 22 vezes
Mens.Curtidas: 62 vezes

Dúvida SQL / confirmação

Mensagempor JoséQuintas » 16 Jul 2020 19:16

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, multithread, dbfcdx, ADO+MySql, PNotepad
"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 de usuário

JoséQuintas
Membro Master

Membro Master
 
Mensagens: 18013
Data de registro: 26 Fev 2007 11:59
Cidade/Estado: São Paulo-SP
Curtiu: 15 vezes
Mens.Curtidas: 1206 vezes




Retornar para SQL

Quem está online

Usuários vendo este fórum: Nenhum usuário registrado online e 7 visitantes


Ola Amigo, espero que meu site e forum tem lhe beneficiado, com exemplos e dicas de programacao.
Entao divulgue o link da Doacao abaixo para seus amigos e redes sociais ou faça uma doacao para o site forum...
MUITO OBRIGADO PELA SUA DOACAO!
Faça uma doação para o forum
cron
v
Olá visitante, seja bem-vindo ao Fórum Clipper On Line!
Efetue o seu login ou faça o seu Registro