【问题标题】:IBM DB2 update using JOIN使用 JOIN 更新 IBM DB2
【发布时间】:2015-12-11 18:06:50
【问题描述】:

我需要根据客户信息更新包含订单的表格。这就是我接近它的方式,但显然 DB2 不支持 UPDATE 中的 JOIN。我正在开发 IBM iSeries。

UPDATE lib.orders as o
  JOIN lib.customers as c
  ON   o.cstmrid = c.id
SET    o.updatehere = 'NEWVALUE' 
WHERE  c.info = 'VALUE'

关于这个话题已经有很多问题了,但没有一个能真正帮助我。

谢谢!

【问题讨论】:

标签: sql join sql-update db2


【解决方案1】:

好的,这真的很晚了,但万一有人读到这篇文章:没有一个 cmets/answers 是正确的。重要的一点是,我正在开发一个使用 db2 udb 并且既不支持更新连接也不支持合并(至少是我们使用的版本)的系列。 我发现唯一可行的方法是 WHERE EXISTS 子句。

【讨论】:

    【解决方案2】:

    我会推荐类似的东西:

    UPDATE lib.orders
    SET updatehere = 'NEWVALUE'
    WHERE cstrmid in (
      SELECT id
      FROM lib.customers
      WHERE info = 'VALUE'
    )
    

    实际上,更新语句有四个主要部分:

    1. 正在更新什么表?
      • 可能指定了别名
      • 您的示例使用了一个
      • 我的建议不需要一个
    2. 第 1 项中的哪些字段正在更新?
      • 可以是单个字段,如您的示例中所示
      • 可以是一个元组,包含多个字段
    3. 第 2 项中填充了哪些值?
      • 可以是单个值或值的元组,具体取决于第 2 项
      • 可以是子查询的结果
        • 必须根据需要返回单个值或元组以匹配第 2 项
        • 可以对第 1 项中指定的表进行联接,以确保为第 1 项的表中的不同行输出不同的值
    4. 第 1 项中的记录有哪些匹配标准?
      • 可以是一个或多个条件
      • 如果不指定,DB/2 将遍历表中的所有记录
      • 可以包含子查询
        • 如果您在第 3 项中有一个子查询,并且与此匹配的行与该子查询的任何结果都不匹配,则第 2 项的字段将被分配空值

    我在建议的第 1 行中指定了第 1 项。

    我在建议的第 2 行指定了第 2 和第 3 项。

    我在第 3 - 7 行中使用子查询指定了第 4 项

    我有时会写更新声明,其中:

    • 项目 2 是多个字段的元组
    • item 3 是一个返回多个值的子查询,连接到 item 1 中指定的表
    • 第 4 项使用了与第 3 项中使用的类似的子查询,但返回的是连接值而不是字段的更新值

    结果是 DB/2 针对项目 1 进行查询,使用项目 4 作为条件,然后遍历结果行,根据项目 3 返回的值更新项目 2 中的字段。由于项目 3 是子查询,因此针对第 1 项中指定的表别名为子查询返回的内容提供了必要的标准。

    我已经编写了更新语句,其中有问题的子查询是表值构造函数。以这种方式,我能够根据一小组已知值更新数百条记录。

    我已经在 iSeries 上的 DB/2 上完成了所有这些工作。我从未使用过 MERGE,因为正如您所注意到的,并非所有版本的 DB/2 都支持它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-30
      • 1970-01-01
      • 2012-11-14
      • 2012-11-14
      • 1970-01-01
      • 2019-02-14
      • 1970-01-01
      相关资源
      最近更新 更多