Voici une manière générique de transformer cette requête de mise à jour du formulaire SQL-server en 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 est une pseudo-colonne qui pointe vers l'emplacement unique d'une ligne. Vous pourriez utiliser à la place la clé primaire de la table si elle en avait une.
La requête #2 de la question ne fait pas ce que vous attendez car la table mise à jour Users
n'est jamais joint à la même table Users u
dans la clause FROM. Tout comme lorsque vous mettez un nom de table deux fois dans une clause FROM, ils ne sont pas implicitement joints ou liés ensemble, ils sont considérés comme deux ensembles de lignes indépendants.