2013-09-22 4 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 (который я хочу для обновления) и esm_report_id, который объединяется с report_id отчета о безопасности
  2. ESM_OWNER.SAFETYREPORT SR ............ с столбцами report_id и MSG_ID (соединенный с msg_id таблицы СООБЩЕНИЯ)
  3. СООБЩЕНИЯ 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», поэтому я ожидаю, что обновление будет сопоставлено один к одному и обновит значения DATE. – user2106410

+0

Любое возможное решение для этого ??? – user2106410

+0

@ lAURENCE Я создал тестовый пример. Как я могу поделиться этим с вами? – user2106410

0

Это выглядит как один из ваших подзапросов, вероятно возвращение более одной строки данных. Возможно, вы можете проверить это, выполнив каждый самостоятельно.

Если вы хотите, чтобы обновление, чтобы применить к ним все, изменить

... = (SELECT... 

в

... IN (SELECT ... 
Смежные вопросы