Jestem nowa w PostgreSQL i próbuję przekonwertować zapytanie z SQL Server.Aktualizacja PostgreS z lewej strony
Mam tabelę Użytkownicy z, między innymi, kolumnami bUsrActive, bUsrAdmin i sUsrClientCode. Chcę zaktualizować użytkowników i ustawić bUsrActive = false, jeśli nie istnieje inny użytkownik o tym samym kodzie SUsrClientCode, gdzie bUsrAdmin = true i bUsrActive = true.
W SQL Server Mam tego zapytania
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
Próbuję przekonwertować to do PostgreSQL. Napisałem 3 podejścia.
1) Moja pierwsza próba. Oczywiście nie działa.
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) Rozumiem, dlaczego nie działa (aktualizuje wszystkich użytkowników). Po prostu nie mogę dowiedzieć się, jak mogę odwołać się do użytkowników tabeli u w części UPDATE ... SET.
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) Następujące działa, ale nie przy użyciu sprzężenia.
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;
Prawdopodobnie pójdę z ostatnim rozwiązaniem. Chciałem tylko wiedzieć, czy można zrobić to, co chcę, używając lewostronnego połączenia.
Co jest nie tak z trzecim? –
Nic, działa. Zastanawiam się, czy mogę to zrobić w inny sposób, używając złączeń. Wydaje się ładniejszy dla oka! Myślę, że wydajność byłaby taka sama. – alfoks
Drugi powinien działać (na pierwszy rzut oka), jaki jest błąd. Czy wiesz, że semantyka klauzuli "OD" jest inna w PostgreSQL w porównaniu do SQL Server? –