使用 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'
)
实际情况是更新语句有四个主要部分:
- 正在更新什么table?
- 可能指定了别名
- 你的例子用了一个
- 我的建议不需要
- 项目 1 中 is/are 的哪些字段正在更新?
- 可以是单个字段,如您的示例
- 可以是元组,包含多个字段
- 第 2 项中填充了哪些值 is/are?
- 可以是单个值或值的元组,具体取决于项目 2
- 可以是子查询的结果
- 必须 return 单个值或元组(根据需要)以匹配项目 2
- 可以加入项目 1 中指定的 table 以确保为项目 1 的 table
中的不同行输出不同的值
- 第 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 都支持它。
我需要根据客户信息更新包含订单的 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'
)
实际情况是更新语句有四个主要部分:
- 正在更新什么table?
- 可能指定了别名
- 你的例子用了一个
- 我的建议不需要
- 项目 1 中 is/are 的哪些字段正在更新?
- 可以是单个字段,如您的示例
- 可以是元组,包含多个字段
- 第 2 项中填充了哪些值 is/are?
- 可以是单个值或值的元组,具体取决于项目 2
- 可以是子查询的结果
- 必须 return 单个值或元组(根据需要)以匹配项目 2
- 可以加入项目 1 中指定的 table 以确保为项目 1 的 table 中的不同行输出不同的值
- 第 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 都支持它。