怎樣纔算是正確的刪除過時的數據呢?先交代一下前提,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 )
正確的理解應該是,不是超級會員的推薦信息就要清理,不僅僅是清理過時的超級會員的信息,還包括那些壓根就沒辦理過超級會員或者會員購買記錄被刪除的用戶信息。博客
好了,寫到這裏這篇博客也差很少了,感受寫的有點過於囉嗦,慢慢改進吧!數據分析
總結:一、不要把問題想得過於簡單,儘可能考慮全面一點!產品
二、有時候多想一步,就能收穫不少,慢慢的也就進步了,加油,曉菜鳥!