【问题标题】:UPDATE statement only works with FETCH FIRSTUPDATE 语句仅适用于 FETCH FIRST
【发布时间】:2018-05-05 03:52:25
【问题描述】:

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

我正在使用以下 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(电源系列)

【问题讨论】:

    标签: db2 ibm-midrange db2-400


    【解决方案1】:

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

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

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

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

    您可能想查看MERGE 语句,您应该在 7.1 中拥有它。

    【讨论】:

    • 如果从概念上讲,子查询仅使用该值运行,我会说 FETCH FIRST 不需要? (鉴于我的表没有重复项,但事实并非如此)(另外,correlated subquery 术语对我来说是陌生的,所以谢谢!)
    • @CodyG。如果它没有重复,那么是的......但在这种情况下您不会看到错误消息。我怀疑虽然TABLE 可能没有序列号的重复项...您的联接正在扇出并返回给定序列号的多行,
    • Bingo Bango:your join is fanning out smacks self
    【解决方案2】:

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

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

    【讨论】:

    • 抱歉没有注意到@Charles 在他的回答中已经提到了合并语句
    猜你喜欢
    • 2022-07-27
    • 2021-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-01
    • 1970-01-01
    相关资源
    最近更新 更多