【问题标题】:Using each sql SELECT result, do an UPDATE使用每个 sql SELECT 结果,执行 UPDATE
【发布时间】:2021-03-15 16:34:01
【问题描述】:

我正在尝试为此查询的每个结果编写一个 sql 查询:

select * from table2 where job_id = 'job1' and size=0

应该在 table1 中将 job_id 设置为 '00'。

到目前为止我已经尝试过:

update table1 set job_id = '00' 
where id from ( select * from table2 where job_id = 'job1' and size=0 )

我猜应该有类似 for each 循环的东西?

【问题讨论】:

  • update 语法是特定于供应商的。请用您正在运行的数据库标记您的问题:mysql、oracle、sqlserver...?

标签: sql select sql-server-2012 sql-update subquery


【解决方案1】:

不,不像循环。相反,您只需使用set 函数。与您尝试的最接近的语法是:

update table1
    set job_id = '00'
    where id in (select t2.id.  -- assuming the comparison column is `id`
                 from table2 t2
                 where t2.job_id = 'job1' and t2.size = 0
                );

update 本身——在概念上——就像一个“for”循环。它是一个set操作,适用于表中所有满足where子句条件的行。

我应该强调“概念上”。 update 不会(必然)一次遍历所有行。关系数据库提供了多种算法来提高查询效率(尽管一个接一个地循环遍历行始终是一种选择)。

【讨论】:

    【解决方案2】:

    假设table1中有id这样的列与子查询的结果进行比较,可以使用运算符IN

    update table1 
    set job_id = '00' 
    where id in (select id from table2 where job_id = 'job1' and size = 0)
    

    【讨论】:

      【解决方案3】:

      在许多数据库中,您可以使用 exists 和相关子查询来表达这一点:

      update table1 
      set job_id = '00' 
      where exists (
          select 1 
          from table2 t2 
          where t2.job_id = 'job1' and t2.size = 0 and t2.id = table1.id
      )
      

      【讨论】:

        猜你喜欢
        • 2010-12-22
        • 2019-12-30
        • 2020-08-13
        • 1970-01-01
        • 1970-01-01
        • 2016-10-28
        • 2012-11-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多