使用 JOIN 更新 IBM DB2

IBM DB2 update using JOIN

我需要根据客户信息更新包含订单的 table。这就是我处理它的方式,但显然 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'

关于该主题的问题已经准备就绪,但 none 确实对我有帮助。

谢谢!

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

我会推荐这样的东西:

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

实际情况是更新语句有四个主要部分:

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

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

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

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

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

  • 项目 2 是多个字段的元组
  • 项目 3 是一个子查询,它 return 编辑了多个值,加入了项目 1
  • 中指定的 table
  • 项目 4 使用的子查询与项目 3 中使用的子查询类似,但return使用连接值而不是更新字段值

结果是 DB/2 针对项目 1 进行了查询,使用项目 4 作为条件,然后遍历结果行,根据从项目 3 return 编辑的值更新项目 2 中的字段。作为项目 3 是一个子查询,针对项目 1 中指定的 table 别名的连接为从子查询 return 编辑的内容提供了必要的标准。

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

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