UPDATE语句仅适用于FETCH FIRST

时间:2018-05-04 13:45:30

标签: db2 ibm-midrange db2-400

我正在尝试使用相关订单的创建日期更新连续出版物的表格。订单最终可能会有重复的数字,因此需要此连接。表上的密钥是序列号。

我正在使用以下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)

2 个答案:

答案 0 :(得分:4)

您拥有所谓的correlated subqueryVC2.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