【问题标题】:SQL Server 2008 Update Query with Join and Where clause in joined tableSQL Server 2008 更新查询与联接表中的 Join 和 Where 子句
【发布时间】:2011-04-14 18:01:15
【问题描述】:

不知道为什么这不起作用:

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 字段设置为取消订阅,其中UserSetting 表中的userID 等于用户表中的userID 和用户表中的emailAddress不在另一个表的电子邮件列表中。我可以使用几乎相同的语法在 isUnsubbed 列上运行选择,它工作正常吗?谢谢!

P.S.我在这里查看了其他类似的问题,语法看起来相同,但显然我遗漏了一些东西。

【问题讨论】:

  • 为什么它不起作用?您是否有错误消息(如果有,消息是什么?)或者您没有预期的结果(如果有,获得的结果是什么?)?
  • 对不起,好问题!它不解析查询..
  • 误按回车。无法更新列或表达式“isUnsubscribedFromSystemEmails”。这些列存在并且是可写的..没有权限问题..然后我得到一些其他的东西,错误消息是:无效的对象名称'ust'。 UserSetting 表肯定存在!选择使用相同的连接和 where in 子句给出正确的结果
  • @toddm: "而用户表中的emailAddress 不是 在另一个表的电子邮件列表中" - 你的意思是BadEmailAddresses,如果那么,您的意思是“在来自BadEmailAddresses 的电子邮件列表中,用户表中的emailAddress 的位置”?
  • 只是关于列名“isUnsubscribedFromSystemEmails”的评论。除了有点长之外,我尽量避免使用负面名称。我更喜欢“SendSystemEmails”之类的东西

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


【解决方案1】:

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

set 语句不能引用 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) 

我添加了注释掉的选择,以便您检查是否获得了所需的结果集。

【讨论】:

  • “无法解析查询文本”无效的对象名称“ust”
  • select * FROM UserSetting AS ust INNER JOIN [User] ON ust.userID = [User].userID AND [User].emailAddress IN (SELECT emailAddress FROM BadEmailAddresses) 顺便说一下!返回预期结果??
  • 如果选择工作正常,我很茫然。为什么不向我们提供一些来自用户设置、用户和电子邮件地址的示例数据,我们可以根据您期望的数据进行测试。
  • 我在我的机器上尝试了我给你的东西,它解析并运行。你确定你使用了我所做的吗? (我将最后一个和一个更改为 where 但在功能上是相同的,并且两个版本都有效,我只是更喜欢仅将连接用于连接所需的内容)。关键是将 ust.isUnsubscribedFromSystemEmails = 1 更改为 isUnsubscribedFromSystemEmails = 1
【解决方案2】:

试试这个:

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

【讨论】:

  • 我试过这个..其中一个 isUnsubbed 列在 ust 表中..即使进行了这个更改,查询也不会解析。
【解决方案3】:

试试:

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

【讨论】:

  • 这会将 UserSetting.isUnsubscribedFromSystemEmails 中的每条记录设置为 true
  • 所以每个用户的电子邮件都是坏的?
【解决方案4】:

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

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

【讨论】:

  • 这行得通。谢谢!随后更新了两次集合..但在这一点上我可以不在乎。谢谢!
【解决方案5】:

注意:只是为了记录(假设您可以正常工作),您还可以对 BadEmailAddresses 表进行内部联接。

如果您有任何性能问题,那么您可能希望在两个表中为 emailAddress 列建立索引。

【讨论】:

  • 实际上,当子查询像问题中的那样简洁时,INNER JOIN 的性能不如子查询。对此更合适的扩展是将[User] 转换为在WHERE 子句中运行子查询的视图。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-14
  • 2015-03-29
  • 1970-01-01
  • 2022-11-16
  • 1970-01-01
  • 2012-08-31
  • 1970-01-01
相关资源
最近更新 更多