我正在尝试将少量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的任何帮助都会很棒。谢谢!
答案 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插入几行,并显示预期的结果,我们可以测试我们的代码,并且可能能够给你更准确的答案。