【问题标题】:Update multiple rows with sub query使用子查询更新多行
【发布时间】:2011-08-24 15:00:31
【问题描述】:

我有两个表,UserStatus 和 User。

UserStatus 有两个字段: 用户名,状态

用户有两个字段 用户名,已删除

这是我正在使用的查询

Update users
   set deleted = '1'
where username = (select username
                    from tempDUDPIVOT 
                   where status = 'inactive')

但得到错误:

子查询返回超过 1 个值。当子查询跟随 =、!=、、>= 或子查询用作表达式时,这是不允许的。

我尝试了许多变体,但无法找出解决方案...我感觉它非常明显。

感谢您的帮助。

谢谢。

【问题讨论】:

    标签: sql sql-update


    【解决方案1】:

    UPDATE 语法需要标量子查询。使用EXISTS (subquery) 使谓词的参数更紧密地结合在一起(即使查询更易于阅读和维护,IMO),例如

    UPDATE users 
       SET deleted = '1' 
     WHERE EXISTS (
                   SELECT *
                     FROM tempDUDPIVOT AS T1
                    WHERE T1.status = 'inactive'
                          AND T1.username = users.username
                  );
    

    如果您的 SQL 产品支持,您也可以使用标准 SQL MERGE(尽管请注意此处的谓词参数更远):

    MERGE INTO users 
       USING (
              SELECT username
                FROM tempDUDPIVOT
               WHERE status = 'inactive'
             ) AS T1 (username)
          ON T1.username = users.username
    WHEN MATCHED THEN 
       UPDATE
          SET users.deleted = '1';
    

    【讨论】:

    • 感谢您的帮助。它在 SQL2005 上,所以我没有可用的合并。
    【解决方案2】:
    Update users set deleted = '1'
    where username IN (select username from tempDUDPIVOT where status = 'inactive')
    

    IN 接受要返回的 0..inf 值,= 接受 1 且仅接受一个(不是 0 或 42)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多