从oracle中的表中删除时出现错误“ORA-01732:数据操作操作在此视图上不合法”

时间:2018-01-18 09:32:05

标签: oracle db2

在Db2中运行相同的查询,但在oracle中它给出了错误。 请帮忙。提前谢谢。

delete from  (SELECT   
     EMP_ID,
     SAL,
     ROW_NUMBER() OVER (PARTITION BY EMP_ID ORDER BY SAL DESC) As RN
FROM     FPM.FACT_PL_BS
WHERE    MEASUREMENT_PERIOD_ID=20170811
AND      SCENARIO_ID=1) A where RN>1}

1 个答案:

答案 0 :(得分:0)

检查文档Notes on Updatable Views

  

视图不得包含以下任何构造:

     
      
  • 设置运算符
  •   
  • DISTINCT运算符
  •   
  • 汇总或分析功能
  •   
  • GROUP BY,ORDER BY,MODEL,CONNECT BY或START WITH子句
  •   
  • SELECT列表中的集合表达式
  •   
  • SELECT列表中的子查询
  •   
  • 指定为WITH READ ONLY的子查询
  •   
  • 加入,但有一些例外情况,如“Oracle数据库管理员指南”中所述。
  •   

ROW_NUMBERAnalytic Function,因此不允许更新。

我认为这个应该有效(未经测试):

delete from FPM.FACT_PL_BS
WHERE ROWID =ANY 
(SELECT   ROW_ID 
FROM 
   (SELECT ROWID as ROW_ID,
     EMP_ID,
     SAL,
     ROW_NUMBER() OVER (PARTITION BY EMP_ID ORDER BY SAL DESC) As RN
   FROM     FPM.FACT_PL_BS
   WHERE    MEASUREMENT_PERIOD_ID=20170811
      AND      SCENARIO_ID=1)
WHERE RN > 1;

或者

delete from FPM.FACT_PL_BS
WHERE MEASUREMENT_PERIOD_ID=20170811
   AND SCENARIO_ID=1
   AND ROWID <>ALL 
      (select MAX(ROWID) KEEP (DENSE_RANK FIRST ORDER BY SAL) OVER (PARTITION BY EMP_ID)
       FROM FPM.FACT_PL_BS)