IT序号网

sql之带有左连接的 Oracle 更新

emanlee 2024年02月27日 编程语言 22 0

我想简单地使用传入的参数而不是从另一个表更新单个表的行集,但为了识别行,我需要进行左连接。这是要选择的查询:

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 子句中有限制,所以无论如何它的行为就像一个内部联接。


评论关闭
IT序号网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!