PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment le côté FROM d'un UPDATE est-il lié à la table ciblée pour UPDATE ?

La UPDATE requête que vous affichez est exactement la même que :

UPDATE fromemailaddress f
SET    call = true 
FROM  (
   SELECT fromemailaddress
   FROM   email 
   WHERE  subject ILIKE '%tester%'
   ) e
WHERE  e.fromemailaddress = f.fromemailaddress;

subject ILIKE '%tester%' est un équivalent plus rapide pour subject ~ 'tester' . Détails pour LIKE , ILIKE et correspondance d'expression régulière (~ ) dans le manuel ou dans cette réponse connexe sur dba.SE :

Et efficacement identique à :

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

Utilisez ceci à la place.

S'il doit y avoir plusieurs lignes dans la table email avec le même fromemailaddress correspondant à une ligne dans fromemailaddress , alors ce formulaire n'en exécute un mise à jour par ligne, contrairement à votre malheureux original.

Ne soyez pas confus par le fait que fromemailaddress est utilisé comme colonne et comme nom de table ici.

Lisez attentivement le manuel ici et ici . En particulier ce morceau :