PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como o lado FROM de um UPDATE se relaciona com a tabela direcionada para UPDATE?


A UPDATE consulta exibida é exatamente igual a:
UPDATE fromemailaddress f
SET    call = true 
FROM  (
   SELECT fromemailaddress
   FROM   email 
   WHERE  subject ILIKE '%tester%'
   ) e
WHERE  e.fromemailaddress = f.fromemailaddress;

subject ILIKE '%tester%' é um equivalente mais rápido para subject ~ 'tester' . Detalhes para LIKE , ILIKE e correspondência de expressão regular (~ ) no manual ou nesta resposta relacionada em dba.SE:

E eficaz o mesmo que:
UPDATE fromemailaddress f
SET    call = true
WHERE  EXISTS (
   SELECT 1
   FROM   email e
   WHERE  e.fromemailaddress = f.fromemailaddress
   AND    e.subject ILIKE '%tester%'
   );

Use isso em vez disso.

Se houver várias linhas na tabela email com o mesmo fromemailaddress correspondendo a uma linha em fromemailaddress , este formulário só executa um atualização por linha, ao contrário do seu original infeliz.

Não se confunda pelo fato de que fromemailaddress é usado como coluna e como nome de tabela aqui.

Leia o manual com atenção aqui e aqui . Em particular este bit: