Sql 正确删除用户过时的数据

 

  怎样才算是正确的删除过时的数据呢?先交代一下前提,XX网站上面有一个放心企业专区,办理超级会员便可成为放心企业,放心企业可设置推荐职位展现在放心企业专区,信息都是存放在Info表中的,所谓的推荐职位就是把信息从Info表再写到推荐职位表(RecommPosition)中,而用户办理的超级会员是有有效期的,办理超级会员时会新写一条记录到会员办理记录表(PackageRecord)中,不会更改用户信息,采用关联用户表和会员办理记录表来实现,由于相似这样的东西还有不少,有些产品不合适就会被淘汰掉,若是每新出一个产品就在User表中新加字段来进行标识,那么长此以往User表中的字段就会很冗余,因此采用和对应的表进行关联来实现,这样能够避免后期维护的难度。额,回归正题,当用户办理的超级会员到期时,系统须要自动清理掉会员到期的用户设置的推荐职位信息,由于推荐职位表中的记录都是从Info表中写进来的,信息实际上都是存储在Info表中的,推荐职位表只是关联Info表的Id、专业、地区等部分信息用于筛选,因此推荐职位表至关于一张临时表,表中的记录能够进行物理删除。固然,若是你要拿来作数据分析的话也能够采用逻辑删除。sql

  删除会员到期的用户设置的推荐职位信息:优化

delete [RecommPosition] where [UserId] in
(
    select [UserId] from [PackageRecord] where [PackagePid]=1 and [EndTime]<GETDATE()
)

  乍一看好像没有什么问题,可是我忽略了一个问题,由于会员办理记录表里记录的是各个会员的销售状况,会拿来作财务统计和数据分析,这种表的记录是不会被删除的,因此就可能会出现一个用户有多条记录的状况,因此我须要对用户Id进行去重。假如超级会员的有效期是一个月,有用户之前办理过超级会员,用了用以为效果还不错这个月又想继续办理,这一个用户就有多条会员办理记录了,遇到这种状况咱们上面的Sql语句就会误删除掉一部分用户的推荐职位。由于既有到期的会员办理记录又有未到期的会员办理记录的用户他事实上是属于放心企业的。因此咱们只能删除掉超级会员过时且没有继续办理超级会员的用户设置的推荐职位信息。网站

  删除超级会员过时且没有继续办理超级会员的用户设置的推荐职位信息:spa

 

--删除过时的用户且不在未过时的用户当中.
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语句很差理解,咱们再想办法优化优化。code

  删除用户的信息,可是只要他还有有效的会员办理记录则不能被删除,也就是说咱们只能删除那些全部的到期时间中最大的到期时间都小于当前时间的用户的推荐职位信息blog

delete [RecommPosition] where [UserId] in
(
    select [UserId] from [PackageRecord] where [PackagePid]=1 group by [UserId] having MAX([EndTime])<GETDATE()
)

  看到这里好像是没有什么问题了,但每每有你意想不到的事情发生,有一天博主发现,推荐职位表中居然多了一条非超级会员的推荐信息,真不知道这条数据是怎么写进来的,并且这个时候你可能会发现我目前这个sql根本就删不掉这条非超级会员的推荐信息,为啥呢?由于我只删除了办理过超级会员且超级会员已通过期的用户,对于那些有推荐信息可是压根就没买过超级会员或者会员购买记录被删除的用户根本没法实施删除,压根就没有考虑过居然会有非超级会员的推荐信息,得了,赶忙完善sql去。get

 

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
)

 

  正确的理解应该是,不是超级会员的推荐信息就要清理,不仅仅是清理过时的超级会员的信息,还包括那些压根就没办理过超级会员或者会员购买记录被删除的用户信息博客

 

  好了,写到这里这篇博客也差很少了,感受写的有点过于啰嗦,慢慢改进吧!数据分析

  总结:一、不要把问题想得过于简单,尽可能考虑全面一点!产品

     二、有时候多想一步,就能收获不少,慢慢的也就进步了,加油,晓菜鸟

相关文章
相关标签/搜索