2012-07-30 69 views
0

我正试图将几个MS Access查询转换为Oracle。以下是来自MS Access的查询之一。带更新的Oracle更新

 

    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:无法修改映射到非键保存表的错误列。我从您的网站跟踪了不同的示例(包括MERGE)并修改了我的原始查询。现在,我收到ORA-30926:无法在源表中获得一组稳定的错误。

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

任何帮助将此查询翻译成Oracle将是伟大的。谢谢!

回答

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插入几行并显示预期结果,那么我们可以测试我们的代码,并且可能会给您更准确的答案。