【问题标题】:SQL - Update table values from values in another tableSQL - 从另一个表中的值更新表值
【发布时间】:2015-02-03 03:10:35
【问题描述】:

我有一个 select 语句,每次它与表 real_values 上的值不匹配时,它都会向我显示原始表中的所有数据。

因此,每次不匹配时,我希望查询使用正确的值更新它,而不是向我显示哪些路由的容量值错误。

以下是一个较短的版本,可用作示例: http://sqlfiddle.com/#!4/6a904/1

我如何才能更新值,而不是选择语句?我尝试了一些我在网上看到的东西,但似乎没有任何效果。

【问题讨论】:

    标签: sql oracle oracle11g


    【解决方案1】:

    @DavidFaber 的回答是大多数人会这样做。但是,对于这种查询,我更喜欢使用merge 而不是update

    MERGE INTO original o
    USING      real_values rv
    ON         (o.origin = rv.origin AND o.destination = rv.destination)
    WHEN MATCHED THEN
       UPDATE SET
          o.capacity_wt = rv.capacity_wt, o.capacity_vol = rv.capacity_vol
          WHERE         o.capacity_wt != rv.capacity_wt
                     OR o.capacity_vol != rv.capacity_vol
    

    (我不清楚您是要更新original还是real_values,所以我选择了一个。如果我弄错了,扭转它应该是微不足道的。)

    当您想要更新多个列时,我发现merge 更具可读性和更易于使用。

    【讨论】:

      【解决方案2】:

      Oracle 中此类更新查询的通常形式如下:

      UPDATE table1 t1
         SET t1.value = ( SELECT t2.value FROM table2 t2
                           WHERE t2.key = t1.key )
       WHERE EXISTS ( SELECT 1 FROM table2 t2
                       WHERE t2.key = t1.key );
      

      虽然我很困惑。您已将此问题标记为 oraclesql-server,但您的小提琴链接使用 MySQL。

      【讨论】:

      • 转储EXISTS运算符并添加“t2.value is not NULL”之类的条件会更有效吗?
      • 我不明白为什么会这样。
      • 我更新了小提琴,但是对于我想要更新的每个值执行一个选择语句仍然没有意义?如果我想更新 4 个值,我需要选择每个值吗?
      • @randomizertech:可以成组更新:set (value1, value2) = (select value1, value2 from...
      【解决方案3】:

      在 SQL Server 中,您会这样做

      update original set capacity_wt=b.capacity_wt,capacity_vol=b.capacity_vol
      from original a, real_values b
      where a.origin = b.origin 
      and a.destination = b.destination 
      and (a.capacity_wt != b.capacity_wt
      or b.capacity_vol != b.capacity_vol);
      

      【讨论】:

      • 我收到一条错误消息“ORA-00933:SQL 命令未正确结束”
      • 所以,您使用的是 Oracle 而不是 SQL Server
      猜你喜欢
      • 2021-10-28
      • 1970-01-01
      • 1970-01-01
      • 2021-11-12
      • 2010-10-21
      • 1970-01-01
      • 2012-08-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多