数据库表数据比较的优化问题

goodcxl 2008-12-10 09:27:36
我现在有两个表,一个记录的是基准信息,一个记录的是当前信息。表结构类似,(基准表比当前表多一个字段)

现在比较两个表记录差异时,我是循环取当前表的一个记录,然后到基准表中查询,如果在基准表中找到,则有这个,否则,对该记录进行标记。

与此同时,循环取基准表的一个记录,然后到当前表中查询,如果在当前表中找到,则有这个,否则,对该记录进行标记。

总结为:标记两个表除合集外的所有记录。

我现在这种方法查询比较慢,查询并显示得1——2秒。

寻找优化的方法。
...全文
95 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
来灵 2008-12-10
  • 打赏
  • 举报
回复
UP,学习。
康斯坦汀 2008-12-10
  • 打赏
  • 举报
回复
两个表定义主健,比如是ID,
然后:

select * from 当前信息 where ID not in(select ID from 基准信息)

得到的就是没有的记录。

如果要加标记:

update 当前信息 set 标记 = 没有的记录 where 当前信息.ID not in(select ID from 基准信息)

这是最优化的。
goodcxl 2008-12-10
  • 打赏
  • 举报
回复
3q
康斯坦汀 2008-12-10
  • 打赏
  • 举报
回复
那如果主键是四个字段组合的呢,

主健越少越好,这是数据库设计原则,如果义一定是四个字段组合的话,语句就麻烦了。

假设主健是ID1,ID2,ID3,ID4

select * from 当前信息 where ID1 not in(select ID1 from 基准信息) and ID2 not in(select ID2 from 基准信息)
and ID3 not in(select ID3 from 基准信息) and ID4 not in(select ID4 from 基准信息)

in()函数一次只处理一个数据字段集合,所以必须像上面这样写。



你的语句只能标记一个表,如果两个表都标记,还要加

正确
goodcxl 2008-12-10
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 r3000 的回复:]
两个表定义主健,比如是ID,
然后:

select * from 当前信息 where ID not in(select ID from 基准信息)

得到的就是没有的记录。

如果要加标记:

update 当前信息 set 标记 = 没有的记录 where 当前信息.ID not in(select ID from 基准信息)

这是最优化的。
[/Quote]

你的语句只能标记一个表,如果两个表都标记,还要加
select * from 基准信息 where ID not in(select ID from 当前信息)
goodcxl 2008-12-10
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 r3000 的回复:]
两个表定义主健,比如是ID,
然后:

select * from 当前信息 where ID not in(select ID from 基准信息)

得到的就是没有的记录。

如果要加标记:

update 当前信息 set 标记 = 没有的记录 where 当前信息.ID not in(select ID from 基准信息)

这是最优化的。
[/Quote]

那如果主键是四个字段组合的呢,
select * from 当前信息 where ID not in(select ID from 基准信息)

中的ID能不能改成这四个字段的组合呢
goodcxl 2008-12-10
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 r3000 的回复:]
两个表定义主健,比如是ID,
然后:

select * from 当前信息 where ID not in(select ID from 基准信息)

得到的就是没有的记录。

如果要加标记:

update 当前信息 set 标记 = 没有的记录 where 当前信息.ID not in(select ID from 基准信息)

这是最优化的。
[/Quote]
先谢过。

4,012

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 数据库
社区管理员
  • 数据库
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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