drop table t1
drop table t2
create table t1(id int primary key,nickname varchar(20),playNum varchar(20))
create table t2(id int primary key,nickname varchar(20),playNum varchar(20))
insert into t1 values(1,1,10)
insert into t1 values(2,2,20)
insert into t1 values(3,3,30)
insert into t2 values(1,1,10)
insert into t2 values(2,2,200)
insert into t2 values(3,33,300)
commit
提供过程中涉及的几个问题的思路:1 删除环节:es_stat_logondays_user 表的数据量是多少,数据超过几十万以上的话,建议使用truncate table (需要支持的mysql版本)或删表重建方式(需要权限支持);
2 查询环节(这个是最重要的环节):优化下insert 中的select 查询吧;
其中的s 虚表的子查询部分先优化下,条件里对字段使用CONCAT应该是忌讳。
(select DISTINCT v.adminId,v.courseId from view_stattologondays_user v ,(
select admin_id,course_id from es_stu_record
where action_type=6 group by admin_id,course_id) e where CONCAT(ifnull(v.adminId,111),ifnull(v.courseId,222))!= CONCAT(ifnull(e.admin_id,111),ifnull(e.course_id,222))
) s
3 插入环节:es_stat_logondays_user 的索引和外键情况如何,尝试在insert 前加上:
set sql_log_bin = 0
set unique_checks = 0
set foreign_key_checks = 0
这个问题是集合减的问题很可惜 你这个是mysql,只能用not in
select?id?from?客户表
where?id?not?in?
(
select?id?from?数据表1?WHERE?上传数据时间>now()-7
union
select?id?from?数据表2?WHERE?上传数据时间>now()-7
union
select?id?from?数据表3?WHERE?上传数据时间>now()-7
union
select?id?from?数据表2?WHERE?上传数据时间>now()-7
)
如果你使用的是oracle,还有效率更高的方法,用关键字minus
select?id?from?客户表
minus
select?id?from?数据表1?WHERE?上传数据时间>sysdate-7
minus
select?id?from?数据表2?WHERE?上传数据时间>sysdate-7
minus
select?id?from?数据表3?WHERE?上传数据时间>sysdate-7
minus
select?id?from?数据表2?WHERE?上传数据时间>sysdate-7
或者sqlserver使用关键字except
select?id?from?客户表
except
select?id?from?数据表1?WHERE?上传数据时间>getdate()-7
except
select?id?from?数据表2?WHERE?上传数据时间>getdate()-7
except
select?id?from?数据表3?WHERE?上传数据时间>getdate()-7
except
select?id?from?数据表2?WHERE?上传数据时间>getdate()-7
以上
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)