程序实现无主键查询删除

需求大致如下
表A可以通过导入表格来生成数据表C,然而表格中无主键,主键是导入表A后生成的。
现需要导入表B,找出表B和数据库中表C的相同条,然后删掉

难点:

  • 1.表B中无主键
  • 2.表B中存在所以内容都相同的N条数据的可能,所以进行
select B.a,B.b,B.c
	from B,C
	where B.a=C.a
		and B.b = C.b
		and B.c = C.c;

表B

a b c
1 2 3
1 2 3

表C

a b c
1 2 3
1 2 3

这种查询的时候会发生笛卡尔积的血案:
原本2条重复数据变成2*2=4条。

a b c
1 2 3
1 2 3
1 2 3
1 2 3

如果这种问题在查询部分,危害还不算大,问题是要进行删除操作,如果表C有3条,表B有2条,则原本用户的想法是,想删掉2条,保留1条,当前这种方式,除了冗余外,还会造成删除错误

解决思路

1.去重再select

B表去重后得到表D,再用D表与C笛卡尔积

select D.a,D.b,D.c
	from D,C
	where  (select distinct a,b,c from B)D=C.a
		and D.b = C.b
		and D.c = C.c;

2.双游标拿张数

这里讲下思路:

B表拿第一行,C表拿第一行,首行相同,取最小行数到新的列表;
首行不同,获取B第一行相同的行数,跳过前面N行;
继续比较,直到C表到结尾;
如果B未到结尾,则B的剩余行数不用考虑。

思路比较复杂,因为无法保证导入数据正确,我这还有个错误数据导出的功能。就是B有C无导出。

另一思路

如果不需要查找,不害怕弄错,DBA给了个建议就是直接遍历excel表格,一条一条删掉,删不掉就是有错,导出给用户。缺点是不能限制条数。

你可能感兴趣的:(数据库,j2ee)