【问题标题】:Update statement in SQLSQL 中的更新语句
【发布时间】:2013-09-22 17:05:12
【问题描述】:

我正在编写一个更新触发器并且正在努力处理更新语句:

声明如下:

UPDATE ARGUS_APP.CMN_REG_REPORTS CARR 
SET CARR.DATE_SUBMITTED =
(
  SELECT To_Date(M.ACKNOWLEDGMENTHEADER.MESSAGEDATE,'YYYYMMDDHH24MISS') Messagedate 
  FROM esm_owner.MESSAGES M 
  WHERE M.ACKNOWLEDGMENTHEADER.MESSAGESENDERIDENTIFIER='PMDA' 
)
WHERE  CARR.DATE_SUBMITTED =
(
  SELECT CARR.DATE_SUBMITTED  
  FROM  esm_owner.safetyreport sr,esm_owner.MESSAGES M,ARGUS_APP.CMN_REG_REPORTS CARR 
  WHERE sr.report_id=CARR.esm_report_id 
    AND M.msg_id  = sr.msg_id 
    AND M.ACKNOWLEDGMENTHEADER.MESSAGESENDERIDENTIFIER='PMDA' 
)

我每次都得到 ORA:01427。

表结构如下:

我有 3 张桌子

  1. ARGUS_APP.CMN_REG_REPORTS CARR ......有列 DATE_SUBMITTED(我想更新)和 esm_report_id 与安全报告的 report_id 连接
  2. ESM_OWNER.SAFETYREPORT SR............具有report_id和MSG_ID列(与MESSAGES表的msg_id连接)
  3. MESSAGES M ..........具有 MSG_ID 和 ACKNOWLEDGMENTHEADER.MESSAGESENDERIDENTIFIER 列

请帮我解决这个问题。

【问题讨论】:

  • 您的一个子查询返回不止一行,这是导致错误的原因。从您的问题中不清楚您想如何解决这个问题。
  • MessagesMESSAGESENDERIDENTIFIER 上不是唯一的,或者您的其他子查询有问题...如果没有更多信息,我们无法提供帮助,我们当然可以不能比你自己解决它更快......

标签: sql oracle sql-update


【解决方案1】:

我要大胆尝试一下,猜猜这就是你所追求的。它们的关键特性是将子选择与更新相关联(子选择中的carr 指的是外部语句中的表)。

Update
    argus_app.cmn_reg_reports carr
set 
    carr.date_submitted = (
        Select
            To_Date(m.AcknowledgmentHeader.MessageDate, 'YYYYMMDDHH24MISS') Messagedate 
        from 
            esm_owner.Messages m
                inner join
            esm_owner.SafetyReport sr
                on m.msg_id = sr.msg_id
        where
            carr.esm_report_id = sr.report_id And
            m.AcknowledgmentHeader.MessageSenderIdentifier = 'PMDA'
        )
Where
    Exists (
        Select
            'x'
        From
            esm_owner.Messages m
                Inner Join
            esm_owner.SafetyReport sr
                on m.msg_id = sr.msg_id
        Where
            carr.esm_report_id = sr.report_id and
            m.AcknowledgmentHeader.MessageSenderIdentifier = 'PMDA' 
    )

这是一个展示基本原理工作的示例:

Example Fiddle

【讨论】:

  • 两个子查询都返回 9 行,因为我使用了过滤条件“PMDA”,因此我希望更新能够一对一映射并更新 DATE 值。
  • @lAURENCE 我确实设置了一个测试用例..如何与您分享?
  • 我在创建过程中确实省略了 PMDA 的事情
  • 如何在 URL 上看到??
  • 是顶部的 View Sample Fiddle 按钮吗?但我在那里看不到任何东西
【解决方案2】:

看起来您的子查询之一可能返回多行数据。您也许可以通过单独运行每个来检查这一点。

如果您希望更新适用于所有人,请更改

... = (SELECT...

... IN (SELECT ...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-30
    • 2015-05-09
    • 2014-08-06
    • 2016-03-25
    相关资源
    最近更新 更多