首页 > 解决方案 > 使用具有和 MIN 函数非键保留表错误进行更新

问题描述

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

表中电:

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无法修改映射到非键保留表的列

标签: sqloraclesql-update

解决方案


语句的这种语法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关键字而不是逗号分隔 JOIN的语法
  • 无需重复条件row_ind = 1两次,将第二个替换row_ind = p.row_ind为更可取

Demo


推荐阅读