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

Posted

技术标签:

【中文标题】更新查询更新所有记录 - 只希望选择记录更新【英文标题】:Update Query Updating All Records - Only Want Select Records Updated 【发布时间】:2018-11-28 17:58:17 【问题描述】:

更新:我正在使用来自以下响应的查询。运行此查询时,如果未找到与 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)

【问题讨论】:

只需添加带有限制更新记录的条件的 WHERE 子句。 UPDATE table SET column=value WHERE some-condition 【参考方案1】:

我认为你只需要一个相关的子查询:

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';

【讨论】:

戈登,这将是我的下一个问题。我遇到它返回不止一排。在测试较低的查询时,我收到错误:FROM keyword not found where expected 有什么想法吗?

以上是关于更新查询更新所有记录 - 只希望选择记录更新的主要内容,如果未能解决你的问题,请参考以下文章

访问选择查询记录集不可更新

根据选择查询更新记录

如何在同一个sql查询中更新和选择记录

PLSQL 触发器 - 基于选择查询更新记录

检测重叠日期并更新最新记录SQL Server 2008

MySQL触发器:更新一张表中的记录,其中同一行中的记录匹配选择查询