使用具有和 MIN 函数非键保留表错误进行更新

Posted

技术标签:

【中文标题】使用具有和 MIN 函数非键保留表错误进行更新【英文标题】:Update using having and MIN function non key-preserved table error 【发布时间】:2020-02-12 04:44:00 【问题描述】:

我在两个不同的表中有以下数据。我可以使用选择查询检索所需的记录,但是我无法更新这些记录的ROW_IND。我使用的更新语句给了我错误。任何指针将不胜感激。

表 CLP:

ID              KEY     EFF_DT              ROW_IND
28420000000006  4599    1/1/2000                1
28420000000006  21164   10/16/2019              1
28420000000011  58429   1/1/2000                1
28420000000011  68434   10/16/2019              1

表格 CPI:

KEY2    ID2 
21164   28420000000006
68434   28420000000011

查询:

SELECT  p.id ,  p.key, i.key AS KEY2, i.id AS ID2, p.EFF_DT, p.row_ind
  FROM CLP P, CLI I
 WHERE p.id = i.id
   AND P.KEY <> I.KEY
   AND p.row_ind = 1
   AND P.id IN
              (
                SELECT id 
                  FROM CLP
                 WHERE row_ind = 1
                 GROUP BY id
                 HAVING count(*) > 1
               );


ID              KEY      KEY2   ID2             EFF_DT          ROW_IND
28420000000006  4599    21164   28420000000006  1/1/2000                1
28420000000011  58429   68434   28420000000011  1/1/2000                1

更新查询:

UPDATE 
(
 < The Above SELECT Query >
) A
SET A.row_ind  = 0

错误: ORA-01779无法修改映射到非键保留表的列

【问题讨论】:

【参考方案1】:

UPDATE 语句的这种语法不能在 Oracle 中使用,但可以在 mysql 中使用。或者,您可以尝试使用MERGE 语句:

MERGE INTO CLP t
    USING 
        (
          SELECT  p.id ,  p.key, i.key AS KEY2, i.id AS ID2, p.EFF_DT, p.row_ind
            FROM CLP p
            JOIN CPI i 
              ON p.id = i.id
           WHERE p.key <> i.key
             AND p.row_ind = 1
             AND P.id in
              (
              SELECT id 
                FROM CLP
               WHERE row_ind = p.row_ind
               GROUP BY id
              HAVING count(*) > 1
              ) 
         ) tt
      ON (tt.key2 = t.key)
    WHEN MATCHED THEN UPDATE SET t.row_ind = 0;

在哪里

您最好将旧式 SELECT 语句转换为 包含显式 JOIN 关键字而不是逗号分隔的语法 JOINs 不需要重复条件row_ind = 1两次,替换 第二个row_ind = p.row_ind 更可取

Demo

【讨论】:

以上是关于使用具有和 MIN 函数非键保留表错误进行更新的主要内容,如果未能解决你的问题,请参考以下文章

Oracle - 更新连接 - 非键保留表

Oracle - 更新连接 - 非键保留表

更新表不能修改映射到非键保留表的列

ORA-01779 无法修改映射到非键保留表的列

选择了具有“保留(或强)”属性的属性进行综合

尝试进行分层更新会导致错误“无法插入外键值”