UPDATE 语句仅适用于 FETCH FIRST

UPDATE statement only works with FETCH FIRST

我正在尝试用相关订单的创建日期更新 table 个连续出版物。订单最终可能有重复的数字,所以需要这个连接。 table 上的键是序列号。

我正在使用以下 SQL 更新新字段 MYCRTDAT。它似乎可以正常工作,但只能使用 FETCH FIRST 1 ROW ONLY 语句。 我通过快速浏览验证了这些行更新了正确的日期。

NOT 使用该语句时,return 出现一个错误,即 基本谓词的子选择产生了不止一行

我认为这个错误是有道理的,但我不明白 VC2.SERIALNUM 是如何 'passed' --- 它是作为奇异值还是同时作为所有行?如果一次是所有行,那么 FETCH FIRST 不只是 return 每次都是第一行吗?

UPDATE SCHEMA.TABLE VC2
SET MYCRTDAT = (
-- Get Date from Associated Table
SELECT
    MO1.CRDT
FROM 
SCHEMA.TABLE VC1
  LEFT JOIN  SCHEMA.M1 MO1 ON
    VC1.ORDER = MO1.ORDER
    AND VC1.ITEM = MO1.ITEM
WHERE VC2.SERIALNUM = VC1.SERIALNUM
FETCH FIRST 1 ROW ONLY
);

IBM DB2 for i - 7.1(POWER 系列)

您拥有所谓的 correlated subqueryVC2.SERIALNUM = VC1.SERIALNUM 是相关的原因。

从概念上讲,对于每个值 VC2.serialnum,子查询 运行 具有该值。

因此,为什么需要 FETCH FIRST 以及为什么它 returns 每个 serailnum 的第一行。

你可以想象,一个相关的子查询经常表现得很差。在某些情况下,Db 可以重写查询,这样它就不必重复访问内部 table;特别是在 UPDATE 像你这样的单列的情况下。

您可能想查看 MERGE 声明,您应该在 7.1 看到它。

我认为这个查询的更好版本应该是使用 MERGE 语句

MERGE INTO SCHEMA.TABLE VC2
USING SCHEMA.TABLE VC1 LEFT JOIN  SCHEMA.M1 MO1
...
WHEN MATCHED THEN UPDATE MYCRTDAT = MO1.CRDT
else
ignore