SQL-根据多个条件更新表中的行

时间:2019-03-01 14:35:43

标签: sql postgresql

我是SQL的新手,我必须创建一个请求以根据多种条件更新表中的多行。

从此示例:

id email                 organisationid    principaluserid role
1  john@smith.com        MULT              null            100
2  john@smith.C-100.com  C-100             1               25
3  john@doe.com          MULT              null            100
4  john@doe.C-101.com    C-101             3               50
5  john@doe.C-102.com    C-102             3               25
6  jessica@smith.com     C-102             null            25

目标是更新“用户”表中所有的条目,其中Organisationid等于“ MULT”,并且只有1个Principaleuserid匹配。

在上面的示例中,前2个条目符合我的条件。 然后,我需要将id = 2电子邮件(john@smith.C-100.com)替换为id = 1电子邮件(john@smith.com)的电子邮件。

要逐步完成这项工作,我尝试检索与此请求匹配的所有符合条件的条目:

从@The_impaler答案编辑:

SELECT * FROM User a1 WHERE a1.organisationid = 'MULT' AND (
 SELECT COUNT(*) FROM User a2 WHERE a2.principaluserid = a1.id
) = 1;

但是我仍然在更新条目的方式上遇到麻烦。任何帮助表示赞赏!

3 个答案:

答案 0 :(得分:0)

如果我理解正确,那么update应该可以解决问题:

update user u
    set u.email = um.email
    from user um
    where um.id = u.principaluserid and
          um.organizationid = 'MULT' and
          not exists (select 1
                      from user up2
                      where up2.principaluserid = u.principaluserid and
                            up2.id <> u.id
                     );

答案 1 :(得分:0)

您可以使用基于加入的更新

UPDATE user u1
SET u1.email =  u2.email
FROM user u2 
WHERE u2.organisationid = 'MULT' 
       AND u1.id = u2.principaluserid 

,如果您只需要具有一个principaluserid的值 您可以使用

UPDATE user u1
  SET u1.email =  u2.email
FROM user u2 
INNER JOIN 
(
      select principaluserid , count(*)
      from user 
      group by principaluserid 
      having count(*) =1
    ) t2 ON t2.principaluserid = u2.principaluserid 
    AND  u2.organisationid = 'MULT' 
      AND u1.id = u2.principaluserid 

答案 2 :(得分:0)

基于@The_impaler的建议,我做了此查询,似乎可以满足我的需求:

UPDATE user u1 
  SET organisationid = (SELECT u2.organisationid FROM user u2 WHERE u1.id = u2.principaluserid),
  WHERE u1.organisationid = 'MULT' AND 
(SELECT COUNT(*) FROM user u2 WHERE u2.principaluserid = u1.id) = 1;