PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wie bezieht sich die FROM-Seite eines UPDATE auf die Tabelle, auf die UPDATE abzielt?

Das UPDATE Abfrage, die Sie anzeigen, ist genau dasselbe wie:

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

subject ILIKE '%tester%' ist ein schnelleres Äquivalent für subject ~ 'tester' . Details für LIKE , ILIKE und Übereinstimmung mit regulären Ausdrücken (~ ) im Handbuch oder in dieser verwandten Antwort auf dba.SE:

Und effektiv dasselbe wie:

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

Verwenden Sie stattdessen dies.

Wenn in der Tabelle email mehrere Zeilen vorhanden sein sollen mit derselben fromemailaddress Übereinstimmung mit einer Zeile in fromemailaddress , dann führt dieses Formular nur eine aus Aktualisierung pro Zeile, im Gegensatz zu Ihrem unglücklichen Original.

Lassen Sie sich nicht von der Tatsache verwirren, dass fromemailaddress wird hier als Spalten- und als Tabellenname verwendet.

Lesen Sie das Handbuch sorgfältig hier und hier . Insbesondere dieses Bit: