Postgres update von left join
Ich bin neu in PostgreSQL und versuchen, zu konvertieren, eine Abfrage von SQL Server.
Ich habe eine Tabelle Benutzer mit unter anderem den Spalten bUsrActive, bUsrAdmin und sUsrClientCode. Ich möchte aktualisieren von Benutzern und bUsrActive = false, wenn es nicht vorhanden ist ein anderer Benutzer mit dem gleichen sUsrClientCode wo bUsrAdmin = true und bUsrActive = true.
In SQL-Server habe ich diese Abfrage
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
Ich versuche zu konvertieren, das auf postgres. Ich schrieb 3 Ansätze.
1) Mein Erster Versuch. Natürlich nicht.
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) ich verstehe, warum es nicht funktioniert (es updates alle Benutzer). Ich kann einfach nicht herausfinden, wie kann ich die Verweis-Tabelle Benutzer u in der UPDATE ... SET Teil.
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) Die folgenden arbeiten, aber nicht mit join.
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;
Wohl mit die Letzte Lösung. Ich wollte nur wissen, ob es möglich ist, zu tun, was ich will mit einem left join.
- Was ist falsch mit dem Dritten?
- Nichts, es funktioniert. Einfach Fragen, wenn ich es tun kann, der andere Weg mit Verknüpfungen. Scheint schöner für das Auge! Ich denke, das wäre die Leistung die gleiche ist.
- Der zweite sollte funktionieren (auf den ersten Blick), was ist die Fehlermeldung, die Sie erhalten?. Sind Sie sich bewusst, dass die Semantik der
FROM
Klausel ist anders in PostgreSQL im Vergleich zu SQL Server? - Ich bin neu und lernen. Der zweite wird alle aktualisieren der Datensätze in Tabelle Users, nicht nur die "Benutzer u".
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist eine generische Art und Weise zu verändern diese update-Abfrage aus SQL-server-form zu PostgreSQL:
ctid ist eine pseudo-Spalte, die Punkte, um die einzigartige Position einer Zeile. Sie könnten anstelle der Primärschlüssel der Tabelle, wenn Sie eine hatten.
Die Abfrage #2 aus der Frage nicht zu tun, was Sie erwarten, weil die aktuelle Tabelle
Users
ist nie Mitglied der gleichen TabelleUsers u
in der FROM-Klausel. Ebenso, wenn Sie den Namen einer Tabelle zweimal in einer FROM-Klausel, die Sie nicht bekommen, implizit verbunden oder aneinander gebunden, werden Sie als zwei unabhängige Sätze von Zeilen.Ich denke, das ist der richtige Weg, das zu tun 2) ich glaub es ist mehr optimal/effizient ist, als bei einem sub-select.