带联接的Oracle Update

时间:2012-07-30 16:48:34

标签: oracle sql-update

我正在尝试将少量MS Access查询转换为Oracle。以下是MS Access的查询之一。


    UPDATE [RESULT] INNER JOIN [MASTER]
      ON  ([RESULT].[LAST_NAME] = [MASTER].[LAST_NAME]) 
      AND ([RESULT].[FIRST_NAME] = [MASTER].[FIRST_NAME]) 
      AND ([RESULT].[DOCUMENT_NUMBER] = [MASTER].[DOCUMENT_NUMBER]) 
      AND ([RESULT].[BATCH_ID] = [MASTER].[LEAD_ID]) 
    SET [MASTER].[CLOSURE_REASON] = "Closed For Name and Document Number Match", 
        [MASTER].[RESULT_ID] = [RESULT].[ID], 
        [MASTER].[RESULT_PID] = [RESULT].[PID]
    WHERE (([MASTER].[CLOSURE_REASON] Is Null) 
      AND  ([MASTER].[REC_CODE] = "A1") 
      AND  ([RESULT].[EVENT_DATE] = [MASTER].[EVENT_DATE]) 
      AND  ([RESULT].[EVENT_TYPE] = "Open")
      AND  ([MASTER].[DOCUMENT_NUMBER] Is Not Null)
      AND  ([MASTER].[DOCUMENT_NUMBER)]  "null"));

首先我收到了ORA-01779:无法修改映射到非密钥保留表的列Error。我在您的网站上关注了不同的示例(包括MERGE)并修改了原始查询。现在,我收到ORA-30926:无法在源表Error中获得一组稳定的行。

大多数示例显示表之间只有一个连接,但我必须根据我的要求进行更多连接。

将此查询转换为Oracle的任何帮助都会很棒。谢谢!

1 个答案:

答案 0 :(得分:1)

我认为这应该是等同的。

UPDATE master m
   SET closure_reason = 'Closed For Name and Document Number Match',
       (result_id, result_pid) = (SELECT r.id, r.pid
                                    FROM result r
                                   WHERE m.last_name       = r.last_name
                                     AND m.first_name      = r.first_name
                                     AND m.lead_id         = r.batch_id
                                     AND m.document_number = r.document_number
                                     AND m.event_date      = r.event_date
                                     AND r.event_type      = 'Open')
 WHERE m.closure_reason IS NULL
   AND m.rec_code = 'A1'
   AND m.document_number IS NOT NULL
   AND m.document_number != 'null'
   AND EXISTS( SELECT 1
                 FROM result r
                WHERE m.last_name       = r.last_name
                  AND m.first_name      = r.first_name
                  AND m.lead_id         = r.batch_id
                  AND m.document_number = r.document_number
                  AND m.event_date      = r.event_date
                  AND r.event_type      = 'Open' )

然而,显然,这没有经过测试。如果你可以发布DDL来创建你的表,DML插入几行,并显示预期的结果,我们可以测试我们的代码,并且可能能够给你更准确的答案。