我是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;
但是我仍然在更新条目的方式上遇到麻烦。任何帮助表示赞赏!
答案 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;