Oto ogólny sposób przekształcenia tego zapytania aktualizującego z postaci serwera SQL na 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 to pseudokolumna, która wskazuje na unikalną lokalizację wiersza. Możesz zamiast tego użyć klucza podstawowego tabeli, jeśli taki ma.
Zapytanie #2 z pytania nie spełnia oczekiwań, ponieważ zaktualizowana tabela Users
nigdy nie jest dołączany do tej samej tabeli Users u
w klauzuli FROM. Podobnie jak w przypadku dwukrotnego umieszczenia nazwy tabeli w klauzuli FROM, nie zostaną one niejawnie połączone ani powiązane ze sobą, są traktowane jako dwa niezależne zestawy wierszy.