我正在尝试使用相关订单的创建日期更新连续出版物的表格。订单最终可能会有重复的数字,因此需要此连接。表上的密钥是序列号。
我正在使用以下SQL更新新字段MYCRTDAT
。它似乎工作正常,但只能使用FETCH FIRST 1 ROW ONLY
语句。
我通过快速查看来验证行更新了正确的日期。
当 NOT 使用该语句时,它返回错误基本谓词的子选择产生多行
我认为这个错误是有道理的,但我不明白VC2.SERIALNUM是如何'传递'的 - 它是一个奇异值还是一次性所有行?如果它同时是所有行,那么FETCH FIRST
不仅每次都返回第一行吗?
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 SERIES)
答案 0 :(得分:4)
您拥有所谓的correlated subquery。 VC2.SERIALNUM = VC1.SERIALNUM
是它相关的原因。
从概念上讲,对于每个值VC2.serialnum
,子查询都使用该值运行。
因此,为什么需要FETCH FIRST
以及为什么它返回每个serailnum的第一行。
你可以想象,相关的子查询通常表现很差。在某些情况下,Db可以重新编写查询,以便它不必重复访问内部表;特别是在你所拥有的单个列的UPDATE
的情况下。
您可能希望查看MERGE
语句,您应该在7.1。
答案 1 :(得分:0)
我认为这个查询的更好版本应该是使用MERGE语句
MERGE INTO SCHEMA.TABLE VC2
USING SCHEMA.TABLE VC1 LEFT JOIN SCHEMA.M1 MO1
...
WHEN MATCHED THEN UPDATE MYCRTDAT = MO1.CRDT
else
ignore