没有一个密钥保留的表解决方法,无法从视图中删除

时间:2016-11-29 10:20:39

标签: oracle plsql

我有一张桌子x_visa。我想删除此表中的重复列。

我正在使用的查询是:

  select * from   (SELECT x_visa.*,
                ROW_NUMBER() over (partition by effective_start_date, effective_end_date, person_id,
                   business_group_id, legislation_code , current_visa_permit, visa_permit_type, visa_permit_id, configuration_id
               order by person_id) AS rn
        from   x_visa) T
WHERE  rn > 1 ); 

delete语句发出错误:ORA-01752:如果没有一个密钥保留表,则无法从视图中删除

delete from
(select * from   (SELECT x_visa.*,
                ROW_NUMBER() over (partition by effective_start_date, effective_end_date, person_id,
                   business_group_id, legislation_code , current_visa_permit, visa_permit_type, visa_permit_id, configuration_id
               order by person_id) AS rn
        from   x_visa) T
WHERE  rn = 1 ); 

是否有解决方法从此表中删除重复数据?

1 个答案:

答案 0 :(得分:2)

每行都有rowid个标识符。因此,您可以删除查询结果中的rowid位置。

delete from x_visa where rowid in (/*YOUR QUERY*/);  

所以我们有:

delete from x_visa where rowid in (select r from   (SELECT x_visa.rowid r, x_visa.*,
                ROW_NUMBER() over (partition by effective_start_date, effective_end_date, person_id,
                   business_group_id, legislation_code , current_visa_permit, visa_permit_type, visa_permit_id, configuration_id
               order by person_id) AS rn
        from   x_visa) T
WHERE  rn > 1 ))