0
点赞
收藏
分享

微信扫一扫

程序实现无主键查询删除


需求大致如下
表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表格,一条一条删掉,删不掉就是有错,导出给用户。缺点是不能限制条数。


举报

相关推荐

0 条评论