更新所有记录的查询更新-仅希望选择记录更新

时间:2018-11-28 17:58:17

标签: sql oracle plsql sql-update data-dictionary

更新:我正在使用来自以下响应的查询。运行此查询时,如果找不到与where条件匹配的内容,则会清除SERVICE_DATE_OUT字段。有没有解决的办法?

UPDATE PMEQMT P
       SET SERVICE_DATE_OUT = (SELECT MAX(TL.TRANS_DATE)
                        FROM TRANSLOG TL
                        WHERE P.EQNO = TL.ITEMNO AND 
                              TL.LOC_DESC = 'E-OUT OF SERVICE' AND
                              TL.TRANS_DATE >= SYSDATE - 1
                       )
WHERE P.CLASS = 'TL'

我要在这里完成的是,当TRANSLOG表上的ITEMNO位于E-OUT OF SERVICE / E-IN SERVICE位置并且与PMEQMT.EQNO匹配时,然后为相应的PMEQMT.EQNO更新SERVICE_DATE_OUT / IN。 。

查询正在更新PMEQMT表中的所有记录的SERVICE_DATE_OUT / IN。有人可以帮助我修改查询以仅将匹配的PMEQMT.EQNO更新为TRANSLOG.ITEMNO吗?

UPDATE  PMEQMT
SET     SERVICE_DATE_OUT = (SELECT B.TRANS_DATE
                       FROM TRANSLOG B, PMEQMT A
                       WHERE A.EQNO = B.ITEMNO AND
                       A.CLASS = 'TL' AND
                       B.LOC_DESC = 'E-OUT OF SERVICE' AND
                       B.TRANS_DATE >= SYSDATE - 1)

UPDATE  PMEQMT
SET     SERVICE_DATE_IN = (SELECT B.TRANS_DATE
                       FROM TRANSLOG B, PMEQMT A
                       WHERE A.EQNO = B.ITEMNO AND
                       A.CLASS = 'TL' AND
                       B.LOC_DESC = 'E-IN SERVICE' AND
                       B.TRANS_DATE >= SYSDATE - 1)

1 个答案:

答案 0 :(得分:0)

我认为您只想要一个相关的子查询:

UPDATE PMEQMT p
    SET SERVICE_DATE_OUT = (SELECT tl.TRANS_DATE
                            FROM TRANSLOG tl
                            WHERE p.EQNO = tl.ITEMNO AND
                                  p.CLASS = 'TL' AND
                                  tl.LOC_DESC = 'E-OUT OF SERVICE' AND
                                  tl.TRANS_DATE >= SYSDATE - 1
                           );

我认为逻辑并不正确-子查询正在外部表上进行过滤,并且它可能返回多个行。如果我要推测的话,这更接近于您想要的:

UPDATE PMEQMT p
    SET SERVICE_DATE_OUT = (SELECT MIN(tl.TRANS_DATE)
                            FROM TRANSLOG tl
                            WHERE p.EQNO = tl.ITEMNO 
                                  tl.LOC_DESC = 'E-OUT OF SERVICE' AND
                                  tl.TRANS_DATE >= SYSDATE - 1
                           )
    WHERE p.CLASS = 'TL';