数据比对的sql(oracle数据库)
2013-07-18 15:45
190 查看
一个表中uniquecoding字段有重复值,还有一个cmp_state字段,代表状态,要求对uniquecoding字段重复的记录只留一条不做标记,其它的对其cmp_state全都标记为"重复"
-- 去重,自己比自己
update COMP_ASC_TEST_1 set cmp_state='重复' where id in(
select b.id from
(
select id,uniquecoding,rownum num from(
select id,uniquecoding from COMP_ASC_TEST_1 ascs where uniquecoding in
(
select distinct uniquecoding from COMP_ASC_TEST_1 group by uniquecoding having count(uniquecoding)>1-- order by uniquecoding asc
)order by uniquecoding asc--, uniquecoding asc
)
) a join
(
select id,uniquecoding,rownum-1 num from(
select id,uniquecoding from COMP_ASC_TEST_1 ascs where uniquecoding in
(
select distinct uniquecoding from COMP_ASC_TEST_1 group by uniquecoding having count(uniquecoding)>1-- order by uniquecoding asc
)order by uniquecoding asc--, uniquecoding asc
)
) b
on a.num=b.num and A.UNIQUECODING=b.uniquecoding
)
--获取两个表中uniquecoding一致并且条数一样的记录(N:N),并跟新为“id不一致1-1”
update COMP_ASC_TEST_1 asc_test set asc_test.cmp_state='id不一致1-1'
where
asc_test.uniquecoding in
(
select aa.uniquecoding,TOTAL1 from
(
select count(ascs.uniquecoding) as total1,uniquecoding from COMP_ASC_TEST_1 ascs group by uniquecoding order by total1 desc
) aa,
(
select count(bw.uniquecoding) as total2,uniquecoding from comp_tskf_test_1 bw group by uniquecoding order by total2 desc
) bb
where aa.uniquecoding=bb.uniquecoding
and total1=total2 and total1>1
)
--获取两个表中uniquecoding一致并且条数一样的记录(1:1)且asc目bw非的记录,并跟新状态为“ASC目BW非”
update COMP_ASC_TEST_1 asc_test set asc_test.cmp_state='ASC目BW非'
where
asc_test.uniquecoding in
(
select ASCS.ID from comptest_asc ASCS,comptest_by BW where ASCS.WANQUANYIZHI=BW.WANQUANYIZHI and
ASCS.wanquanyizhi in
(
select aa.wanquanyizhi from
(
select count(ascs.wanquanyizhi) as total1,wanquanyizhi from comptest_asc ascs group by wanquanyizhi order by total1 desc
) aa,
(
select count(bw.wanquanyizhi) as total2,wanquanyizhi from comptest_by bw group by wanquanyizhi order by total2 desc
) bb
where aa.wanquanyizhi=bb.wanquanyizhi
and total1=total2 and total1=1
) and substr(ASCS.receiver_id,0,1)='M'
and substr(BW.RECEIVER_ID,0,1)='F'
)
--N:N+N,更新N端,设置状态为:“客户id不一致2”
UPDATE COMP_ASC_TEST_1 SET CMP_STATE='客户id不一致2' WHERE ID IN
(
SELECT A.ID FROM
(
SELECT ID,UNIQUECODING,ROW_NUMBER() OVER (PARTITION BY UNIQUECODING ORDER BY UNIQUECODING) AS ORD FROM COMP_ASC_TEST_1
)A JOIN
(
SELECT ID,UNIQUECODING,ROW_NUMBER() OVER (PARTITION BY UNIQUECODING ORDER BY UNIQUECODING) AS ORD FROM COMP_TSKF_TEST_1
)
B ON A.UNIQUECODING=B.UNIQUECODING AND A.ORD=B.ORD
AND A.UNIQUECODING IN
(
SELECT A.UNIQUECODING FROM
(
SELECT COUNT(*) AS TOTAL,UNIQUECODING FROM COMP_ASC_TEST_1 GROUP BY UNIQUECODING HAVING COUNT(*)>1
)A JOIN
(
SELECT COUNT(*) AS TOTAL,UNIQUECODING FROM COMP_TSKF_TEST_1 GROUP BY UNIQUECODING HAVING COUNT(*)>1
)B ON A.UNIQUECODING=B.UNIQUECODING AND A.TOTAL<B.TOTAL
)
);
-- 去重,自己比自己
update COMP_ASC_TEST_1 set cmp_state='重复' where id in(
select b.id from
(
select id,uniquecoding,rownum num from(
select id,uniquecoding from COMP_ASC_TEST_1 ascs where uniquecoding in
(
select distinct uniquecoding from COMP_ASC_TEST_1 group by uniquecoding having count(uniquecoding)>1-- order by uniquecoding asc
)order by uniquecoding asc--, uniquecoding asc
)
) a join
(
select id,uniquecoding,rownum-1 num from(
select id,uniquecoding from COMP_ASC_TEST_1 ascs where uniquecoding in
(
select distinct uniquecoding from COMP_ASC_TEST_1 group by uniquecoding having count(uniquecoding)>1-- order by uniquecoding asc
)order by uniquecoding asc--, uniquecoding asc
)
) b
on a.num=b.num and A.UNIQUECODING=b.uniquecoding
)
--获取两个表中uniquecoding一致并且条数一样的记录(N:N),并跟新为“id不一致1-1”
update COMP_ASC_TEST_1 asc_test set asc_test.cmp_state='id不一致1-1'
where
asc_test.uniquecoding in
(
select aa.uniquecoding,TOTAL1 from
(
select count(ascs.uniquecoding) as total1,uniquecoding from COMP_ASC_TEST_1 ascs group by uniquecoding order by total1 desc
) aa,
(
select count(bw.uniquecoding) as total2,uniquecoding from comp_tskf_test_1 bw group by uniquecoding order by total2 desc
) bb
where aa.uniquecoding=bb.uniquecoding
and total1=total2 and total1>1
)
--获取两个表中uniquecoding一致并且条数一样的记录(1:1)且asc目bw非的记录,并跟新状态为“ASC目BW非”
update COMP_ASC_TEST_1 asc_test set asc_test.cmp_state='ASC目BW非'
where
asc_test.uniquecoding in
(
select ASCS.ID from comptest_asc ASCS,comptest_by BW where ASCS.WANQUANYIZHI=BW.WANQUANYIZHI and
ASCS.wanquanyizhi in
(
select aa.wanquanyizhi from
(
select count(ascs.wanquanyizhi) as total1,wanquanyizhi from comptest_asc ascs group by wanquanyizhi order by total1 desc
) aa,
(
select count(bw.wanquanyizhi) as total2,wanquanyizhi from comptest_by bw group by wanquanyizhi order by total2 desc
) bb
where aa.wanquanyizhi=bb.wanquanyizhi
and total1=total2 and total1=1
) and substr(ASCS.receiver_id,0,1)='M'
and substr(BW.RECEIVER_ID,0,1)='F'
)
--N:N+N,更新N端,设置状态为:“客户id不一致2”
UPDATE COMP_ASC_TEST_1 SET CMP_STATE='客户id不一致2' WHERE ID IN
(
SELECT A.ID FROM
(
SELECT ID,UNIQUECODING,ROW_NUMBER() OVER (PARTITION BY UNIQUECODING ORDER BY UNIQUECODING) AS ORD FROM COMP_ASC_TEST_1
)A JOIN
(
SELECT ID,UNIQUECODING,ROW_NUMBER() OVER (PARTITION BY UNIQUECODING ORDER BY UNIQUECODING) AS ORD FROM COMP_TSKF_TEST_1
)
B ON A.UNIQUECODING=B.UNIQUECODING AND A.ORD=B.ORD
AND A.UNIQUECODING IN
(
SELECT A.UNIQUECODING FROM
(
SELECT COUNT(*) AS TOTAL,UNIQUECODING FROM COMP_ASC_TEST_1 GROUP BY UNIQUECODING HAVING COUNT(*)>1
)A JOIN
(
SELECT COUNT(*) AS TOTAL,UNIQUECODING FROM COMP_TSKF_TEST_1 GROUP BY UNIQUECODING HAVING COUNT(*)>1
)B ON A.UNIQUECODING=B.UNIQUECODING AND A.TOTAL<B.TOTAL
)
);
相关文章推荐
- oracle 比对数据库表和数据表数据(PL\SQL)
- 用PL/SQL developer将excel数据导入到Oracle数据库中
- 讲解Oracle数据库中的数据字典及相关SQL查询用法
- 使用PL/SQL将EXCEL数据导入到ORACLE数据库中
- 使用SQL语句进行数据比对
- 用PL/SQL developer将excel数据导入到Oracle数据库中
- oracle数据库查询日期sql语句(范例)、向已经建好的表格中添加一列属性并向该列添加数值、删除某一列的数据(一整列)
- pl/sql,Oracle数据库中,不小心delete数据并提交后如何恢复被删数据
- oracle数据库查询,sql没问题,数据库也有数据,方法没错,项目运行就是查不出数据
- 如何查看Oracle数据库SQL的九种关键数据
- 用PL/SQL把oracle数据库表里的数据导出成insert语句的形式
- 向ORACLE数据库中录入EXCEL表数据 之 PL/SQL Developer8.0
- 讲解Oracle数据库中的数据字典及相关SQL查询用法
- Oracle的to_date函数(SQL语句往Oracle数据库中插入日期型数据)
- 向ORACLE数据库中录入EXCEL表数据 之 PL/SQL Developer8.0
- 71.Oracle数据库SQL开发之 高级查询——用ANY和IS ANY访问所有的数据单元
- Oracle数据库 查询时间在当天内的数据sql
- 利用PL/SQL从Oracle数据库导出和导入数据
- 通过PL/SQL导入数据到oracle数据库
- Oracle数据库比对更新数据