0

我正在尝试将几个 MS Access 查询转换为 Oracle。以下是来自 MS Access 的查询之一。

    更新 [结果] 内部联接 [主]
      开([结果].[LAST_NAME] = [MASTER].[LAST_NAME])
      和([结果].[FIRST_NAME] = [MASTER].[FIRST_NAME])
      AND ([RESULT].[DOCUMENT_NUMBER] = [MASTER].[DOCUMENT_NUMBER])
      AND ([RESULT].[BATCH_ID] = [MASTER].[LEAD_ID])
    SET [MASTER].[CLOSURE_REASON] = "因姓名和证件号码匹配而关闭",
        [MASTER].[RESULT_ID] = [RESULT].[ID],
        [MASTER].[RESULT_PID] = [RESULT].[PID]
    WHERE (([MASTER].[CLOSURE_REASON] 为空)
      AND ([MASTER].[REC_CODE] = "A1")
      和([结果].[EVENT_DATE] = [MASTER].[EVENT_DATE])
      AND ([RESULT].[EVENT_TYPE] = "打开")
      AND([MASTER].[DOCUMENT_NUMBER] 不为空)
      AND ([MASTER].[DOCUMENT_NUMBER)] "null"));

首先我收到 ORA-01779: cannot modify a column which maps to an non-key-preserved table 错误。我遵循了您网站上的不同示例(包括 MERGE)并修改了我的原始查询。现在,我收到 ORA-30926:无法在源表中获得一组稳定的行错误。

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

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

4

1 回答 1

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

于 2012-07-30T17:00:44.267 回答