如何根据两个不同表中存在的记录更新列值?

时间:2013-04-10 10:11:18

标签: sql database tsql

有更好的方法可以做到以下几点吗? (而不是有两个单独的查询)我想将UserTypeId列更新为“USER1” 如果AdminDetails表中存在记录,则为“USER2”。

UPDATE Usernames
SET UserTypeId = (select Id from UserTypes where code = 'USER1')
WHERE EXISTS
(SELECT AdminDetails.Id
FROM AdminDetails
WHERE AdminDetails.Id = Usernames.Id)

UPDATE Usernames
SET UserTypeId = (select Id from UserTypes where code = 'USER2')
WHERE EXISTS
(SELECT AdminDetails.Id
FROM AdminDetails
WHERE AdminDetails.Id = Usernames.Id)

我尝试使用COUNT()但是在尝试使用内部联接和case语句在一个查询中执行此操作时出现以下错误:

UPDATE  Usernames
SET     UserTypeId = (CASE WHEN COUNT(AdminDetails.Id) > 0 THEN 'USER1' ELSE 'USER2' END)
FROM    AdminDetails
        INNER JOIN Usernames AS un
            ON  AdminDetails.Id = un.UserId

但是它会出现以下错误:'聚合可能不会出现在UPDATE语句的集合列表中'。

我希望在一个查询中使用case来执行此操作,然后检查是否存在记录。我怎么能这样做?

1 个答案:

答案 0 :(得分:1)

你可以在EXISTS声明中使用CASE尝试这样的事情:

UPDATE  Usernames
SET     UserTypeId = (CASE WHEN EXISTS 
                                (SELECT AdminDetails.Id
                                 FROM AdminDetails
                                 WHERE AdminDetails.Id = Usernames.Id) 
                           THEN 'USER1' ELSE 'USER2' END)

注意:这将更新ID在两个表中的所有记录,除非您在其上添加WHERE子句。另外,我不确定您是否希望使用值UserTypeIdUSER1更新USER2,这是您的第三个UPDATE语句尝试执行的操作。如果没有看到完整的数据库架构,就很难确切。