我是PostgreSQL的新手,正试图将一个SQL Server查询转换过来。
我有一张名为Users的表,其中包括bUsrActive、bUsrAdmin和sUsrClientCode等列。如果不存在另一个bUsrAdmin和bUsrActive均为true且sUsrClientCode相同的用户,我想更新Users并设置bUsrActive = false。
在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
我试图将这个转换为PostgreSQL。我写了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一部分中引用表Users u。
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) 以下代码可以正常工作,但未使用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;
我可能会选择最后一种解决方案。我只是想知道是否可以使用左连接来实现我想要的内容。