Sql 正确删除用户过期的数据
怎样才算是正确的删除过期的数据呢?先交代一下前提,XX网站上面有一个放心企业专区,办理超级会员即可成为放心企业,放心企业可设置推荐职位展示在放心企业专区,信息都是存放在Info表中的,所谓的推荐职位就是把信息从Info表再写到推荐职位表(RecommPosition)中,而用户办理的超级会员是有有效期的,办理超级会员时会新写一条记录到会员办理记录表(PackageRecord)中,不会更改用户信息,采用关联用户表和会员办理记录表来实现,因为类似这样的东西还有很多,有些产品不合适就会被淘汰掉,如果每新出一个产品就在User表中新加字段来进行标识,那么久而久之User表中的字段就会很冗余,所以采用和对应的表进行关联来实现,这样可以避免后期维护的难度。额,回归正题,当用户办理的超级会员到期时,系统需要自动清理掉会员到期的用户设置的推荐职位信息,因为推荐职位表中的记录都是从Info表中写进来的,信息实际上都是存储在Info表中的,推荐职位表只是关联Info表的Id、专业、地区等部分信息用于筛选,所以推荐职位表相当于一张临时表,表中的记录可以进行物理删除。当然,如果你要拿来做数据分析的话也可以采用逻辑删除。
删除会员到期的用户设置的推荐职位信息:
delete [RecommPosition] where [UserId] in
(
select [UserId] from [PackageRecord] where [PackagePid]=1 and [EndTime]<GETDATE()
)
乍一看好像没有什么问题,但是我忽略了一个问题,因为会员办理记录表里记录的是各个会员的销售情况,会拿来做财务统计和数据分析,这种表的记录是不会被删除的,所以就可能会出现一个用户有多条记录的情况,所以我需要对用户Id进行去重。假如超级会员的有效期是一个月,有用户以前办理过超级会员,用了用觉得效果还不错这个月又想继续办理,这一个用户就有多条会员办理记录了,遇到这种情况我们上面的Sql语句就会误删除掉一部分用户的推荐职位。因为既有到期的会员办理记录又有未到期的会员办理记录的用户他事实上是属于放心企业的。所以我们只能删除掉超级会员过期且没有继续办理超级会员的用户设置的推荐职位信息。
删除超级会员过期且没有继续办理超级会员的用户设置的推荐职位信息:
--删除过期的用户且不在未过期的用户当中.
delete [RecommPosition] where [UserId] in
(
select distinct [UserId] from [PackageRecord] where [PackagePid]=1 and [EndTime]<GETDATE()
)
and [UserId] not in
(
select distinct [UserId] from [PackageRecord] where [PackagePid]=1 and [EndTime]>=GETDATE()
)
这样删除是没有错了,但是上面的Sql用到了not in,效率不是很高,而且Sql语句不好理解,我们再想办法优化优化。
删除用户的信息,但是只要他还有有效的会员办理记录则不能被删除,也就是说我们只能删除那些所有的到期时间中最大的到期时间都小于当前时间的用户的推荐职位信息。
delete [RecommPosition] where [UserId] in
(
select [UserId] from [PackageRecord] where [PackagePid]=1 group by [UserId] having MAX([EndTime])<GETDATE()
)
看到这里好像是没有什么问题了,但往往有你意想不到的事情发生,有一天博主发现,推荐职位表中竟然多了一条非超级会员的推荐信息,真不知道这条数据是怎么写进来的,而且这个时候你可能会发现我目前这个sql根本就删不掉这条非超级会员的推荐信息,为啥呢?因为我只删除了办理过超级会员且超级会员已经过期的用户,对于那些有推荐信息但是压根就没买过超级会员或者会员购买记录被删除的用户根本无法实施删除,压根就没有考虑过竟然会有非超级会员的推荐信息,得了,赶紧完善sql去。
delete [RecommPosition] where [UserId] in
(
select [UserId] from [PackageRecord] where [PackagePid]=1 group by [UserId] having MAX([EndTime])<GETDATE()
)
or [UserId] not in
(
select distinct UserId from [PackageRecord] where [PackagePid]=1
)
正确的理解应该是,不是超级会员的推荐信息就要清理,不单单是清理过期的超级会员的信息,还包括那些压根就没办理过超级会员或者会员购买记录被删除的用户信息。
好了,写到这里这篇博客也差不多了,感觉写的有点过于啰嗦,慢慢改进吧!
总结:1、不要把问题想得过于简单,尽量考虑全面一点!
2、有时候多想一步,就能收获很多,慢慢的也就进步了,加油,晓菜鸟!
Sql 正确删除用户过期的数据的更多相关文章
- SQL批量删除用户表(先删除所有外键约束,再删除所有表)
--批量删除用户表 --1.删除外键约束DECLARE c1 cursor for select 'alter table ['+ object_name(parent_obj) + '] d ...
- oracle 删除用户及相关表数据,释放磁盘空间
来源于:http://www.itpub.net/thread-513609-1-1.html http://bbs.csdn.net/topics/330251089 http://blog.csd ...
- SQL Server删除用户失败的解决方法
在删除SQL Server用户时,有时会报错:Microsoft SQL Server错误: 15138删除对于用户失败,数据库主体在该数据库中拥有架构,无法删除.删除 对于 用户“*****”失败. ...
- 一条sql关联删除多张表数据
现有6张表存在关联关系,要删除主表则其他5张表关联数据也要一块删掉(单条sql多id批量删除) delete t1,t2,t3,t4,t5,t6 FROM rmd_v AS t1 LEFT JOIN ...
- SQL 遍历删除所有表的数据
https://www.cnblogs.com/yige/p/5193253.html declare @sqlTabName varchar(100);-- 声明游标DECLARE C_Employ ...
- linux下如何完全删除用户
1.首先进入系统创建一个用户 [root@localhost /]# useradd haha #创建用户 haha是用户名 [root@localhost /]# passwd haha ...
- SQL SERVER 2008 R2 自动备份并删除过期备份数据
我们的系统维护的过程中肯定需要对数据库进行定期的备份,但是如果定时手工备份的话,不但浪费时间,也不能保证每次都可以按时备份,所以自动备份成为了我们的不二选择,但是定时备份需要定期清理备份文件, ...
- Oracle创建删除用户,角色,表空间,导入导出数据库命令总结(转载)
无意间看到一篇文章,觉得对于ORACLE的新手很实用,特转载,原文出处这里 说明:在创建数据库时输入的密码,是修改系统默认的密码,以system和sysman等系统默认身份登录时要输入的密码就是修改后 ...
- SQL server 语句新建用户、对用户授权、删除用户实例
Grant select on tb to db_user --给db_user用户授权 tb表 查询权限 一.命令操作 USE mydb GO --1. 新建测试用户 --1.1 添加登录用户和密码 ...
随机推荐
- Python--Django学习笔记1
Django:The Web framework for perfectionists with deadlines Django是一个Python语言开发的高级Web框架,采用MVC架构,通过配置可 ...
- AtCoder Regular Contest 076 F - Exhausted?
题意: n个人抢m个凳子,第i个人做的位置必须小于li或大于ri,问最少几个人坐不上. 这是一个二分图最大匹配的问题,hall定理可以用来求二分图最大匹配. 关于hall定理及证明,栋爷博客里有:ht ...
- 洛谷P4043 支线剧情
题意:给定DAG,通过每条边需要时间. 从某号点回到1号点不需要时间. 从1号点出发,求最少要多久才能走完所有边. 解: 有源汇有上下界最小费用可行流. 直接连边,费用为时间,下界为1,无上界. 每个 ...
- NOIP 普及组 2016 回文日期
传送门 https://www.cnblogs.com/violet-acmer/p/9859003.html 题解: 思路1: 相关变量解释: year1,month1,day1 : date1对应 ...
- sqlserver 导入数据出现 无法创建 OLE DB 取值函数。请查看列元数据是否有效
我用的是Sql Server 的导入导出功能来实现的,但是有些数据可以导进去,有些就不行.总是出现一些错误! 执行之前 (错误)消息错误 0xc0202005: 数据流任务: 在数据源中找不到列“Un ...
- IOS 获取系统通讯录中的联系人信息
- (IBAction)getAllContactFromSystem { ABAddressBookRef ab = ABAddressBookCreateWithOptions(NULL, NUL ...
- JAVA记录-WebService开发部署
JWS.Axis2.cxf 1.下载axis2.war和axis2.bin.zip 2.将axis2.war包部署到Tomcat下,启动Tomcat测试:http://localhost:8089/a ...
- npm webpack工具 (监听压缩等)
压缩.监听变动自动打包,:开发后,js编译压缩及样式去空格等 $ webpack --config XXX.js //url使用另一份配置文件(比如webpack.config2.js)来打包 $ w ...
- CSS魔法(四)常用属性
元素的显示与隐藏 display.visibility.overflow 在CSS中有三个显示和隐藏的单词比较常见,我们要区分开,他们分别是 display.visibility 和 overflow ...
- Java入门系列(十)Java IO
概述 总体而言,java的读写操作又分为两种:字符流和字节流. 实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操作文件. 什么是流? ...