我想简单地使用传入的参数而不是从另一个表更新单个表的行集,但为了识别行,我需要进行左连接。这是要选择的查询:
SELECT *
FROM SAMPLE_STATUS pss
LEFT JOIN QC q ON q.SAMPLE_ID = pss.SAMPLE_ID
WHERE q.CONTRACT_CLN_ID = 28 AND q.LOT = 1
我试过几个例子,最后一个只有一列
UPDATE
(SELECT pss.APP_WIN_START_DT, TO_CHAR(sysdate, 'YYYYMMDD') AS NEW_AWSD
FROM SAMPLE_STATUS pss
LEFT JOIN QC q ON q.SAMPLE_ID = pss.SAMPLE_ID
WHERE q.CONTRACT_CLN_ID = 28 AND q.LOT = 1) pq
SET APP_WIN_START_DT = NEW_AWSD
从 QC 表中提取几条记录,这些记录通过样本 ID 连接到 Sample_Status 表。我得到的错误是:
SQL Error: ORA-01779: cannot modify a column which maps to a non key-preserved table
01779. 00000 - "cannot modify a column which maps to a non key-preserved table"
*Cause: An attempt was made to insert or update columns of a join view which
map to a non-key-preserved table.
*Action: Modify the underlying base tables directly.
提前致谢。
请您参考如下方法:
我认为您实际上需要此处的内部连接逻辑,但无论如何您都可以使用 exists 编写此更新:
UPDATE SAMPLE_STATUS pss
SET APP_WIN_START_DT = TO_CHAR(sysdate, 'YYYYMMDD')
WHERE EXISTS (SELECT 1 FROM QC q
WHERE q.SAMPLE_ID = pss.SAMPLE_ID AND
q.CONTRACT_CLN_ID = 28 AND q.LOT = 1);
我怀疑您不想在此处进行左联接的原因是您正在更新联接左侧的表字段。但是由于您在右侧表的 where 子句中有限制,所以无论如何它的行为就像一个内部联接。