Update with FROM this way:
Mysql:
create table produto(clientid integer, valor integer);
create table produto2(clientid integer, valor integer);
insert into produto(clientid , valor) values(1, 100);
insert into produto(clientid , valor) values(2, 200);
insert into produto2(clientid , valor) values(1, 100);
insert into produto2(clientid , valor) values(2, 400);
update produto2 inner join produto on produto.clientid = produto2.clientid set produto2.valor = produto2.valor - produto.valor where produto.valor < produto2.valor;
select * from produto2;
SQL Server:
UPDATE PRODUTO2
SET VALOR = (PRODUTO2.VALOR - P.VALOR)
FROM PRODUTO2
INNER JOIN PRODUTO P (NOLOCK) ON
P.CLIENTID = PRODUTO2.CLIENTEID
WHERE P.VALOR < PRODUTO2.VALOR
How to know which records will be updated? Just switch to select:
SELECT
PRODUTO2.CLIENTID, PRODUTO2.VALOR, P.VALOR
FROM PRODUTO2
INNER JOIN PRODUTO P (NOLOCK) ON
P.CLIENTID = PRODUTO2.CLIENTEID
WHERE P.VALOR < PRODUTO2.VALOR
This is one of the safest ways to perform an UPDATE.
*Atenção*: A mesma tabela que esta no FROM, deverá estar no UPDATE, isto se aplica caso também seja aplicado ALIAS.
Correct examples:
• UPDATE PRODUTO SET VALOR = 1000 FROM PRODUTO WHERE PRODUTO.ID = 3
• UPDATE P SET VALOR = 1000 FROM PRODUTO P WHERE P.ID = 3
INCORRECT EXAMPLE:
• UPDATE PRODUTO FROM PRODUTO P WHERE P.ID = 3
Will SQL allow you to update wrong? Yes. Can this cause inconsistency in the database if you have other relationships? Yes. There is more detailed information about these inconsistencies of the UPDATE clause in the database documentation.
https://docs.microsoft.com/pt-br/sql/t-sql/language-elements/while-transact-sql read about cursors, below are examples.
– Motta