Update,.,,Join

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

Update,.,,Join

Mensagem por JoséQuintas »

Como ficaria o equivalente disto totalmente em MySql

Código: Selecionar todos

   Mensagem( "Anulando reajuste" )
   WITH OBJECT cnMySql
      :ExecuteCmd( "DELETE FROM JPPREHIS WHERE PHDATA=" + DateSql( mDataReajuste ) + " AND PHOBS LIKE 'REAJ.%'" )
      :cSql := "SELECT PHID, PHITEM, PHCADAS, PHFORPAG, PHVALOR FROM JPPREHIS" + ;
               " INNER JOIN" + ;
               " ( SELECT MAX( PHID ) AS ULTIMOLANC FROM JPPREHIS GROUP BY PHITEM, PHCADAS, PHFORPAG ) AS ULTIMO" + ;
               " ON JPPREHIS.PHID = ULTIMO.ULTIMOLANC" + ;
               " ORDER BY PHITEM, PHCADAS, PHFORPAG"
      :Execute()
      DO WHILE ! :Eof()
         SELECT jppreco
         SEEK :StringSql( "PHITEM" ) + :StringSql( "PHCADAS" ) + :StringSql( "PHFORPAG" )
         IF ! Eof()
            RecLock()
            REPLACE jppreco->pcValor WITH :NumberSql( "PHVALOR" )
            RecUnlock()
         ENDIF
         :MoveNext()
      ENDDO
      :CloseRecordset()
   END WITH
Não deu pra testar, porque JPPRECO ainda é DBF, mas tudo indica que seria isto:

Código: Selecionar todos

UPDATE JPPRECO 
JOIN
  ( SELECT PHID, PHITEM, PHCADAS, PHFORPAG, PHVALOR FROM JPPREHIS
  INNER JOIN
      ( SELECT MAX( PHID ) AS ULTIMOLANC FROM JPPREHIS GROUP BY PHITEM, PHCADAS, PHFORPAG ) AS ULTIMO
  ON JPPREHIS.PHID = ULTIMO.ULTIMOLANC
  ) AS NOVOPRECO 
ON JPPRECO.PCITEM=NOVOPRECO.PHVALOR AND JPPRECO.PHCADAS = NOVOPRECO.PHCADAS AND JPPRECO.PCFORPAG=NOVOPRECO.PHFORPAG
SET JPPRECO.PCVALOR = NOVOPRECO.PHVALOR 
Está correto?

JPPREHIS tem o histórico de preços, onde o cadastro é sempre sequencial.
A intenção é salvar o último lançamento de cada conjunto como preço atual em JPPRECO
Existe um preço diferente pra cada conjunto de cliente, produto e forma de pagamento

ULTIMO seria a seleção dos IDs de maior número sequencial
NOVOPRECO seria a seleção de preço desses IDs
e finalmente a atualização relacionando o atual com o NOVOPRECO.

Nota:
Só me preparando pra passar os preços também pra MySql, por enquanto só o histórico está em MySql.
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/
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

Update,.,,Join

Mensagem por alxsts »

[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

Update,.,,Join

Mensagem por JoséQuintas »

Me chamaram a atenção estes:

Trocar pelo valor default
UPDATE employee SET salary=DEFAULT;
Trocar conforme expressão
employee SET salary =
CASE dept
WHEN 'Sales' THEN salary+1000
WHEN 'Technology' THEN salary+500
WHEN 'Marketing' THEN salary+500
ELSE salary
END;
Renumerar, usando ordem de trás pra frente.
UPDATE employee SET id=id+100 order by id desc;
Outros eu até já havia usado, por exemplo o UPDATE com limite, usei no servidor de e-mails pra liberar uma qtde de e-mails por vez.

Na pesquisa para o comando que postei aqui, cheguei a encontrar pergunta num fórum para essa segunda questão mas sem resposta, só indicaram pra fazer um comando por vez. Acabei ficando curioso em saber como poderia ser, e o texto do link acabou mostrando esse CASE.

Isso mostra o quanto se perde usando DBF: muito fonte pra pouca coisa... rs
E ainda não dá pra considerar isso como uso avançado, tem muito mais recurso pela frente.

Gostei mesmo, valeu.

Mais um como retribuição... rs
Atualizando estoque sem precisar do aplicativo fazer isso.

http://www.devmedia.com.br/implementand ... ures/26352
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