请教如下场景的循环怎么写?

Greatcqi 2016-06-28 02:06:17
背景:坑爹程序员A写了个外系统接口,同步组织机构信息到本公司系统。但是接口并没有做UPDATE判断,每次跑都插入新数据,导致每个数据都有N条重复项。。

组织机构表A
ID(long) CODE(varchar200) NAME(varchar200) ENABLE(n2 1可用,-1删除)

要实现的效果是:

将CODE和NAME重复的项,只保留ID最小的那一条可用,其他标记ENABLE字段为-1

以上。求教。
...全文
188 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
足球不是方的 2016-06-29
  • 打赏
  • 举报
回复
update a set ENABLE=-1 --select * from A a inner join ( select min(id) id,code,name from a group by code,name having count(1)>1 ) b on a.id<>b.id and a.code=b.code and a.name=b.name
liuzhe_521 2016-06-28
  • 打赏
  • 举报
回复
update tab_a a set enable = '-1' where rowid <> (select min(rowid) keep(dense_rank first order by id) from tab_a where code = a.code and name = a.name);
嘚嗒搬运工 2016-06-28
  • 打赏
  • 举报
回复
表数据多的话,建议还是备份后直接讲重复数据干掉,可以考虑下这个:
With tmp(ID,CODE,NAME,ENABLE) As
(select 1,'CODE1','NAME1',1 from dual union all
select 2,'CODE1','NAME1',1 from dual union all
select 3,'CODE1','NAME1',1 from dual union all
select 4,'CODE2','NAME2',1 from dual union all
select 5,'CODE2','NAME2',1 from dual union all
select 6,'CODE3','NAME3',1 from dual union all
select 7,'CODE4','NAME4',1 from dual union all
select 8,'CODE4','NAME4',1 from dual union all
select 9,'CODE4','NAME4',1 from dual union all
select 10,'CODE5','NAME5',1 from dual union all
select 11,'CODE5','NAME5',1 from dual union All
select 12,'CODE5','NAME5',1 from dual)
select Id,code,name,row_number() Over (Partition By CODE,Name Order By ID) Rn from tmp
xu176032 2016-06-28
  • 打赏
  • 举报
回复
1、id是主键吗,如果是主键或者唯一的话,用楼上的脚本改一下就行了,把 in 改成 not in。 2、如果id不是主键,可能有重复,就考虑一下用rowid取一条。
js14982 2016-06-28
  • 打赏
  • 举报
回复
是要一个update语句? update A set ENABLE='-1' where ID in (select min(ID) from A group by CODE,NAME );

17,090

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧