Sono nuovo in PostgreSQL e sto provando a convertire una query da SQL Server.Aggiornamento postgres da sinistra join
Ho una tabella Utenti con, tra le altre, le colonne bUsrActive, bUsrAdmin e sUsrClientCode. Voglio aggiornare gli utenti e impostare bUsrActive = false se non esiste un altro utente con lo stesso sUsrClientCode dove bUsrAdmin = true e bUsrActive = true.
In SQL Server ho questa query
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
Sto cercando di convertire questo in Postgres. Ho scritto 3 approcci.
1) Il mio primo tentativo. Ovviamente non funziona.
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) Capisco perché non funziona (aggiorna tutti gli utenti). Non riesco proprio a capire come posso fare riferimento agli utenti della tabella u nella parte 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) Di seguito è funzionante, ma non utilizzando aderire.
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;
probabilmente andrò con l'ultima soluzione. Volevo solo sapere se è possibile fare ciò che voglio usando un join di sinistra.
Cosa c'è che non va con il terzo? –
Niente, funziona. Mi chiedo solo se posso farlo nell'altro modo usando join. Sembra più bello da vedere! Immagino che la performance sarebbe la stessa. – alfoks
Il secondo dovrebbe funzionare (a prima vista) qual è l'errore che ottieni ?. Sei consapevole che la semantica della clausola 'FROM' è diversa in PostgreSQL rispetto a SQL Server? –