在连接表中使用Join和Where子句的SQL Server 2008更新查询

时间:2010-09-20 15:20:32

标签: sql sql-server-2008 join sql-update in-clause

不确定为什么这不起作用:

UPDATE 
    ust
SET  
    ust.isUnsubscribedFromSystemEmails = 1
FROM         
    UserSetting AS ust 
INNER JOIN
    [User] ON ust.userID = [User].userID 
AND 
    [User].emailAddress IN (SELECT emailAddress FROM BadEmailAddresses)

用简单的英语,我试图将isUnsubscribed字段设置为取消订阅,userID表中的UserSetting等于用户表中的userID以及用户表中的emailAddress不在另一个表的电子邮件列表中。我可以使用几乎相同的语法在isUnsubbed列上运行select,它运行正常吗?谢谢!

P.S。我在这里看了其他类似的问题,语法看起来一样,但显然我错过了一些东西。

5 个答案:

答案 0 :(得分:10)

是的,你忽视了一些事情。

set语句不能引用集合左侧的别名。

尝试:

UPDATE  
    ust 
SET   
    isUnsubscribedFromSystemEmails = 1 
--select *
FROM          
    UserSetting AS ust  
INNER JOIN 
    [User] ON ust.userID = [User].userID  
WHERE [User].emailAddress IN (SELECT emailAddress FROM BadEmailAddresses) 

我添加了已注释的选项,以便您可以检查是否正在查看您想要的结果集。

答案 1 :(得分:2)

虽然UPDATE ... FROM语法在某些情况下是必不可少的,但我更喜欢尽可能使用子查询。这样做你需要的吗?

UPDATE UserSetting
SET isUnsubscribedFromSystemEmails = 1
WHERE userID in (SELECT userID from [User]
                WHERE emailAddress in (SELECT emailAddress FROM BadEmailAddresses))

答案 2 :(得分:0)

试试这个:

UPDATE UserSetting ust SET usr.isUnsubscribedFromSystemEmails = 1
WHERE ust.emailAdress IN (select emailAddress from bademailAddresses);

答案 3 :(得分:0)

尝试:

UPDATE  
    UserSetting
SET   
    isUnsubscribedFromSystemEmails = 1 
FROM          
    UserSetting 
INNER JOIN 
    [User] ON UserSetting.userID = [User].userID  
AND  
    [User].emailAddress IN (SELECT emailAddress FROM BadEmailAddresses)

答案 4 :(得分:0)

注意:仅为记录(假设您完成其他所有工作),您还可以在BadEmailAddresses表上进行内部联接。

如果您遇到任何性能问题,那么您可能希望索引两个表中的emailAddress列。