我在PostgreSQL的是新的,並試圖從SQL Server查詢轉換。Postgres的更新左連接
我有一個表用戶,除其他外,列bUsrActive,bUsrAdmin和sUsrClientCode。我想更新的用戶,並設置bUsrActive = false,如果不存在一個其他用戶使用相同的sUsrClientCode其中bUsrAdmin =真實bUsrActive = TRUE。
在SQL Server我有這個疑問
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
我試圖將其轉換爲Postgres的。我寫了3種方法。
1)我的第一次嘗試。顯然不工作。
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)我理解爲什麼它不工作(它會更新所有用戶)。我只是無法弄清楚如何在UPDATE ... SET部分引用table Users。
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)以下工作,但不使用連接。
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;
我可能會用最後的解決方案。我只是想知道是否可以使用左連接來完成我想要的操作。
出了什麼問題,第三個? –
沒什麼,它的工作。只是想知道如果我可以用另一種方式使用連接。看起來更好看!我想性能會是一樣的。 – alfoks
第二個應該工作(一見鍾情)你得到的錯誤是什麼?您是否意識到PostgreSQL中的FROM子句的語義與SQL Server相比有所不同? –