oracle中删除多余的列
今天,刚学了oracle,老师讲了一个删除多余列的练习题,感觉挺有意思的,因此,做了下面的总结。
第一步:查询出重复列的最大ROWID,或者最小ROWID
" || "为连接操作符
select max(rowid) from stuinfo
group by stuname,stuage
having (count(stuname || stuage)>1)
第二步:查询出没有重复列的ROWID,这里必须要写max或者min,不写会报错
select max(rowid) from stuinfo
group by stuname,stuage
having (count(stuname || stuage)=1)
第三步:把两个查询链接一起,然后删除
delete from stuinfo
where rowid not in (
select max(rowid) from stuinfo
group by stuname,stuage
having (count(stuname || stuage)>1)
union
select max(rowid) from stuinfo
group by stuname,stuage
having (count(stuname || stuage)=1)
)
实现原理
1:先按照stuname和stuage两个字段,进行分组,然后通过具有筛选出所有重复的列,这里我们可以取最小的ROWID或者取 最小的ROWID都可以,就是目的拿重复列中的一条。
2:原理基本和步骤1一样,这次拿没有重复的列因此,count(1)= 1,可以理解为步骤1的反面。
3:把前面两步链接,查询的即是所有没重复列的ROWID,通过not 即可删除重复的列。