从 oracle 中的表中删除时出现错误"ORA-01732: data manipulation operation not legal on this view"



在 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}

检查文档 有关可更新视图的说明:

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

  • 集合运算符
  • 独特的运算符
  • 聚合函数或分析函数
  • 分组依据、排序依据、
  • 模型、连接依据或开头为子句
  • 选择列表中的集合表达式
  • 选择列表中的子查询
  • 指定为只读的子查询
  • 联接,但有一些例外,如 Oracle 数据库管理员指南中所述

ROW_NUMBER是一个分析函数,因此不允许更新。

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

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)

相关内容

最新更新