这条sql语句如何优化?

lrest 2004-09-01 02:27:16
系统:vb+access,piii 800
z_arrange_list 记录数 496
z_class 记录 28
z_attend_clock 记录 1900

方案一:
SELECT aa.empl_id, aa.c_day, aa.on_duty, aa.off_duty
from (SELECT a.empl_id, day(a.t_date) AS c_day, b.card_begin, b.on_duty, b.off_duty, b.card_end
FROM z_arrange_list AS a INNER JOIN z_class AS b ON a.class_id=b.class_id) aa
WHERE not (aa.empl_id & aa.c_day & aa.on_duty & off_duty) in
(select card_id & c_day & on_duty & off_duty from z_attend_clock where valid_duty=true and year_mon=200407 group by card_id,c_day, on_duty,off_duty)

执行时间 3分钟以上

方案二:
创建1个临时表
1、SELECT a.empl_id, day(a.t_date) AS c_day, b.card_begin, b.on_duty, b.off_duty, b.card_end into Tmp01 FROM z_arrange_list AS a INNER JOIN z_class AS b ON a.class_id=b.class_id

2、SELECT aa.empl_id, aa.c_day, aa.on_duty, aa.off_duty
from tmp01 aa
WHERE not (aa.empl_id & aa.c_day & aa.on_duty & off_duty) in
(select card_id & c_day & on_duty & off_duty from z_attend_clock where valid_duty=true and year_mon=200407 group by card_id,c_day, on_duty,off_duty)

*执行时间 1.1分

方案三:
创建2个临时表
1、SELECT a.empl_id, day(a.t_date) AS c_day, b.card_begin, b.on_duty, b.off_duty, b.card_end into Tmp01 FROM z_arrange_list AS a INNER JOIN z_class AS b ON a.class_id=b.class_id
2、select (card_id & c_day & on_duty & off_duty) as sect into Tmp02 from z_attend_clock where valid_duty=true and year_mon=200407 group by card_id,c_day, on_duty,off_duty

3、SELECT aa.empl_id, aa.c_day, aa.on_duty, aa.off_duty
from tmp01 aa
WHERE not (aa.empl_id & aa.c_day & aa.on_duty & off_duty) in
(select sect from tmp02)

*执行时间 25秒

'************************************
感觉速度太慢,谁能给我一个好的优化方案
...全文
80 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
lrest 2004-09-01
  • 打赏
  • 举报
回复
to guolibin:
对,我现在是用 表1 left join 表2
然后列出 表1中表2的列为null值的行。
guolibin 2004-09-01
  • 打赏
  • 举报
回复
主要是NOT IN的速度慢,改为LEFT JOIN应该要快些

1,216

社区成员

发帖
与我相关
我的任务
社区描述
VB 数据库(包含打印,安装,报表)
社区管理员
  • 数据库(包含打印,安装,报表)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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