【问题标题】:update table using select from one table records that doesnt' exist in another使用从一个表中选择不存在于另一个表中的记录来更新表
【发布时间】:2014-10-14 20:05:18
【问题描述】:

我知道基本的 SQL,但并不复杂。

我有两个表 [表 1 和表 2],两者都有用户名和成员 ID。表 1 中存在表 2 中不存在的记录。

例如。如果我需要从表 1 中提取所有在表 2 中没有匹配记录的记录,使用用户名作为过滤器,我将编写如下内容:

select * from Table1 a
  where  not exists (select * from Table2 b 
                 where b.MemberID = a.MemberID) and UserName like 'b%'

这很容易。但是,如何使用不同的用户名更新所有这些结果?

我正在尝试在表 1 中查找表 2 中没有匹配记录的相同用户名的所有记录,然后使用我的用户名 ('r%') 更新这些记录。

我知道有些人会问,你有什么尝试...我尝试将 2 个查询作为单个查询使用,但出现很多错误...例如:

update Table1
   set UserName = (select * from Table1 a
   where  not exists (select * from Table2 b 
     where b.MemberID = a.MemberID) and UserName = 'r@gmail.com') 

感谢任何帮助。

【问题讨论】:

  • 您遇到什么错误?也许将 Not Exists 更改为 Not In?
  • 不会因为语法不正确而引发错误。 '不存在'的错误是“当不使用 EXISTS 引入子查询时,选择列表中只能指定一个表达式。”

标签: sql sql-server-2008 subquery


【解决方案1】:

试试这个

UPDATE TAB1
SET    USERNAME = (SELECT TOP 1 USERNAME
                   FROM   TABLE1 A
                   WHERE  USERNAME LIKE 'r%')
FROM   TABLE1 TAB1
WHERE  NOT EXISTS (SELECT 1
                   FROM   TABLE2 B
                   WHERE  B.MEMBERID = TAB1.MEMBERID)
       AND TAB1.UserName LIKE 'b%' 

【讨论】:

  • 嗨@Pradeep,我认为,这将使用 r% 更新所有其他行,但我想指定需要使用用户名为 b% 的不同用户名更新的行
【解决方案2】:

在 SQL 2008 及更高版本中,您可以使用 MERGE 命令根据另一个表的内容对一个表进行复杂的更改。

MERGE INTO Table2 AS Target
USING Table1 AS Source ON Source.MemberID = Target.MemberID AND Source.UserName = Target.UserName
WHEN MATCHED THEN
    UPDATE Target SET [ExtraField] = Source.[SourceField]
WHEN NOT MATCHED THEN
    INSERT INTO Target(MemberID, UserName,ExtraField) VALUES (Source.MemberID, Source.UserName, Source.SourceField)

【讨论】:

  • 感谢 LeeG,我还没有尝试过,因为 @Pradeep 的解决方案有效。但我会定义。试试这个,会尽快让你知道结果。
【解决方案3】:

这应该会更新 Table1 中与您的第一个查询匹配的行。

update Table1
set UserName = 'r@gmail.com'
from (select * from Table1 a
where  not exists (select * from Table2 b 
             where b.MemberID = a.MemberID) and UserName like 'b%')

【讨论】:

  • 感谢@JayL,但这给出了“字符串 '' 后的未闭合引号。消息 102,级别 15,状态 1,第 5 行 '' 附近的语法不正确。”我试图删除最后一个'并运行它,它给出“')'附近的语法错误。”
猜你喜欢
  • 2015-08-27
  • 1970-01-01
  • 1970-01-01
  • 2022-01-21
  • 2013-05-19
  • 2016-06-21
  • 2023-03-18
  • 2022-11-13
  • 1970-01-01
相关资源
最近更新 更多