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 subquery。 VC2.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
我正在尝试用相关订单的创建日期更新 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 subquery。 VC2.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