-1

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

声明如下:

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 列

请帮我解决这个问题。

4

2 回答 2

0

我要大胆尝试一下,猜猜这就是你所追求的。它们的关键特性是将子选择与更新相关联(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

于 2013-09-22T17:22:16.753 回答
0

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

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

... = (SELECT...

... IN (SELECT ...
于 2013-09-22T17:32:17.543 回答