以下查询在As400上运行的DB2中不起作用。我已经读过类似的问题,但是不确定如何相应地修改查询。
merge into AB27PR AB
using (select USER, ROCOMP,REFID, QREADSTAT
from S490JR
where QREADSTAT =1) SR
on
(AB.USER= SR.USER
AND AB.XCCOMP = SR.ROCOMP
AND AB.XEFID = SR.REFID )
when matched
and AB.XREADSTAT = 0
then update set XREADSTAT = SR.QREADSTAT;
既然现在知道是6.1,我们知道MERGE不适合,可以使用直接的UPDATE。最简单的可能是:
update AB27PR AB
set AB.XREADSTAT = 1
where AB.XREADSTAT = 0
and exists( select SR.QREADSTAT
from S490JR SR
where AB.USER = SR.USER
AND AB.XCCOMP = SR.ROCOMP
AND AB.XEFID = SR.REFID
AND SR.QREADSTAT = 1 )
由于AB.XREADSTAT将始终从表S490JR接收(1)值,因此可以将其作为常量提供。唯一的要求是,正确匹配的行应在S490JR中“存在”。
涵盖了此处不需要的条件的更一般的UPDATE看起来像:
update AB27PR AB
set AB.XREADSTAT = ( select max( SR.QREADSTAT )
from S490JR SR
where AB.USER = SR.USER
AND AB.XCCOMP = SR.ROCOMP
AND AB.XEFID = SR.REFID
AND SR.QREADSTAT = 1 )
where AB.XREADSTAT = 0
and exists( select SR.QREADSTAT
from S490JR SR
where AB.USER = SR.USER
AND AB.XCCOMP = SR.ROCOMP
AND AB.XEFID = SR.REFID
AND SR.QREADSTAT = 1 )
在这种情况下,它将提取SR.QREADSTAT中的任何值。当然,由于WHERE子句将值限制为(1),所以它仍然是SET子句的唯一可能结果。
另外,使用MAX()函数来处理S490JR中可能存在满足WHERE条件的多行的可能性。(我们不知道表中的每一行包含什么。)SET子句的子选择的结果集只能包含一行。SET列中只能包含一个值。MAX()函数可确保一个值,即使该值可能在多个匹配行中也是如此。MIN()函数也可以代替MAX()使用。(我希望SQL具有类似ANY()函数的功能,但用于6.1的SQL标准根本没有这样的功能。)
请注意,在两个示例中,子选择都需要对UPDATE语句本身的WHERE子句进行条件设置。您希望确保仅更新“匹配”的行。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句