Postgres mise à jour à partir d'une jointure gauche

Je suis nouveau dans PostgreSQL et tenter de convertir une requête à partir de SQL Server.

J'ai une table Utilisateurs, avec, entre autres, les colonnes bUsrActive, bUsrAdmin et sUsrClientCode. Je veux mettre à jour des Utilisateurs et définir bUsrActive = false si il n'existe pas qu'un autre utilisateur avec le même sUsrClientCode où bUsrAdmin = true et bUsrActive = true.

Dans SQL Server j'ai cette requête

UPDATE u SET u.bUsrActive = 0
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

Je suis en train de convertir cette postgres. J'ai écrit 3 approches.

1) Ma première tentative. Évidemment pas de travail.

UPDATE Users u
    SET bUsrActive = false
FROM Users u2
WHERE u.sUsrClientCode = u2.sUsrClientCode AND u2.bUsrAdmin = true AND u2.bUsrActive = true
AND u.bUsrAdmin = false AND u.bUsrActive = true AND u2.nkUsr IS NULL;

2) je comprends pas pourquoi ça ne fonctionne pas (il les mises à jour de tous les utilisateurs). Je ne peux pas comprendre comment le tableau de référence des Utilisateurs de u dans la mise à JOUR ... JEU de la partie.

UPDATE Users
    SET bUsrActive = false
FROM Users u
LEFT JOIN Users u2 ON u.sUsrClientCode = u2.sUsrClientCode AND u2.bUsrAdmin = true AND u2.bUsrActive = true
WHERE u.bUsrAdmin = false AND u.bUsrActive = true AND u2.nkUsr IS NULL;

3) Le paragraphe suivant est le travail, mais pas à l'aide de la rejoindre.

UPDATE Users
    SET bUsrActive = false
WHERE  NOT EXISTS (
    SELECT 1
    FROM Users u
    WHERE u.sUsrClientCode = Users.sUsrClientCode AND u.bUsrAdmin = true AND u.bUsrActive = true
) AND Users.bUsrAdmin = false AND Users.bUsrActive = true;

Je vais probablement aller avec la dernière solution. Je voulais juste savoir si il est possible de faire ce que je veux à l'aide d'une jointure gauche.

Quel est le problème avec le troisième?
Rien, c'est le travail. Je me demandais si je peux le faire dans l'autre sens: à l'aide de jointures. Semble plus agréable à l'oeil! Je suppose que le rendement sera le même.
Le second doit travailler (à première vue) quelle est l'erreur que vous obtenez?. Savez-vous que la sémantique de la FROM clause est différent dans PostgreSQL par rapport à SQL Server?
Je suis nouveau et de l'apprentissage aujourd'hui. Le deuxième sera mis à jour tous les enregistrements dans la table des Utilisateurs, et pas seulement les "Utilisateurs u".

OriginalL'auteur alfoks | 2013-01-24