DB2 z/OS 按列表更新

Posted

技术标签:

【中文标题】DB2 z/OS 按列表更新【英文标题】:DB2 z/OS update by list 【发布时间】:2012-06-12 15:32:58 【问题描述】:

我在文本文件中有一个 3k ID 的列表。我应该找到具有此类 ID 的行并更新它们。 我希望能像

WITH RECORD_ID
(ID) AS (
'12345',
...
'32134')
UPDATE MY_TABLE T
SET T.NAME = REPLACE(T.NAME, X'03', '')
WHERE EXISTS (SELECT 1 FROM RECORD_ID R WHERE R.ID = T.ID);

但这不起作用。任何的想法?

【问题讨论】:

“不起作用”怎么办?我不熟悉 z-os 版本,但 CTE 在我的 i-os DB2 中似乎无效。如果您正在构建 CTE,为什么不将 id 列表放在 IN(...) 子句中? 我认为如果你有 3000 条记录的列表,IN 会很慢。并寻求更快的更新。 【参考方案1】:

您不能只在 DB2 中的 CTE 中有一个值列表,您必须将这些值UNION ALL 放在一起:

WITH RECORD_ID (ID) AS (
    SELECT '12345' FROM SYSIBM.SYSDUMMY1 UNION ALL
    -- ...
    SELECT '32134' FROM SYSIBM.SYSDUMMY1
)
UPDATE MY_TABLE T
SET T.NAME = REPLACE(T.NAME, X'03', '')
WHERE EXISTS (SELECT 1 FROM RECORD_ID R WHERE R.ID = T.ID);

应该可以。

我同意@X-Zero,不过……似乎IN 子句中的值列表更合适,除非您有特定原因要使用 CTE。

【讨论】:

以上是关于DB2 z/OS 按列表更新的主要内容,如果未能解决你的问题,请参考以下文章

在 DB2 for Z/OS 中创建表分区

从 z/OS 批处理作业运行 XA/JTA 事务

Db2 v12 z/OS 密码哈希表

如何在 z/OS 中编写 DB2 命令脚本?

DB2 z/OS 分层查询

嵌套表表达式不适用于 db2 z/OS