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

Postgres-Update von Left Join

Hier ist ein generischer Weg, um diese Aktualisierungsabfrage vom SQL-Server-Formular in PostgreSQL umzuwandeln:

UPDATE Users
 SET bUsrActive = false
WHERE
 ctid IN (
   SELECT u.ctid FROM Users u
      LEFT JOIN Users u2 ON u.sUsrClientCode = u2.sUsrClientCode AND u2.bUsrAdmin = 1 AND u2.bUsrActive = 1
    WHERE u.bUsrAdmin = 0 AND u.bUsrActive = 1 AND u2.nkUsr IS NULL
)

ctid ist eine Pseudospalte, die auf die eindeutige Position einer Zeile zeigt. Sie könnten stattdessen den Primärschlüssel der Tabelle verwenden, falls vorhanden.

Die Abfrage Nr. 2 aus der Frage macht nicht das, was Sie erwarten, da die aktualisierte Tabelle Users wird nie mit derselben Tabelle Users u verknüpft in der FROM-Klausel. Genau wie wenn Sie einen Tabellennamen zweimal in eine FROM-Klausel schreiben, werden sie nicht implizit verbunden oder zusammengebunden, sie werden als zwei unabhängige Gruppen von Zeilen betrachtet.