2013-09-22 179 views
-1

我写的更新触发,并正与UPDATE语句挣扎:Update语句在SQL

的语句是如下:

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(我想以及与安全报告的report_id联合的esm_report_id
  2. ESM_OWNER.SAFETYREPORT SR ............具有report_id和MSG_ID列(与MESSAGES表的msg_id结合)
  3. MESSAGES M ..........有列MSG_ID和ACKNOWLEDGME NTHEADER.MESSAGESENDERIDENTIFIER

请帮我解决这个问题。

+0

你的一个子查询将返回多行这是什么原因造成的错误。从你的问题中不清楚你想如何解决这个问题。 –

+0

“消息”在“MESSAGESENDERIDENTIFIER”上不是唯一的,或者您的其他子查询有问题...我没有看到我们没有更多信息可以提供帮助,我们当然不能比您更快可以为你自己... – Ben

回答

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

+0

这两个子查询返回9行,因为我期望他们,因为我已经使用了过滤条件'PMDA',所以我期望更新映射一对一和更新日期值。 – user2106410

+0

这个的任何可能的解决方案? – user2106410

+0

@ lAURENCE我确实设置了一个测试案例。我可以与你分享这个案例吗? – user2106410

0

它看起来像你的子查询的一个可能是返回数据的多行。你可以通过单独运行来检查它。

如果你想更新应用到所有这些,改变

... = (SELECT... 

... IN (SELECT ...