PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Aggiornamento Postgres da sinistra join

Ecco un modo generico per trasformare questa query di aggiornamento dal modulo del server SQL a PostgreSQL:

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 è una pseudo-colonna che punta alla posizione univoca di una riga. Potresti invece usare la chiave primaria della tabella se ne avesse una.

La query n. 2 della domanda non fa ciò che ti aspetti perché la tabella aggiornata Users non è mai unito alla stessa tabella Users u nella clausola FROM. Proprio come quando inserisci due volte il nome di una tabella in una clausola FROM, non vengono uniti o vincolati in modo implicito, sono considerati come due insiemi di righe indipendenti.