程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Postgres从左联接更新大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决Postgres从左联接更新?

开发过程中遇到Postgres从左联接更新的问题如何解决?下面主要结合日常开发的经验,给出你关于Postgres从左联接更新的解决方法建议,希望对你解决Postgres从左联接更新有所启发或帮助;

这是将更新查询从sql服务器形式转换为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是指向行的唯一位置的伪列。如果表有主键,则可以改用它。

问题中的查询#2不能满足您的期望,因为更新后的表Users永远不会联接到Users uFROM子句中的同一表。就像您在FROM子句中两次放置一个表名一样,它们不会隐式地连接或绑定在一起,它们被视为两组独立的行。

解决方法

我是PostgreSQL的新手,正在尝试从SQL Server转换查询。

我有一个表Users,其中包括bUsrActive,bUsrAdmin和sUsrClientCode列。我想更新用户并设置bUsrActive =
false,如果不存在另一个具有相同sUsrClientCode的用户,其中bUsrAdmin = true和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部分中引用表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)以下工作正常,但未使用联接。

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;

我可能会考虑最后一种解决方案。我只是想知道是否可以使用左联接来做我想做的事情。

大佬总结

以上是大佬教程为你收集整理的Postgres从左联接更新全部内容,希望文章能够帮你解决Postgres从左联接更新所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: