1. 背景
由于當天的數(shù)據(jù)被昨天的數(shù)據(jù)污染了,需要刪除數(shù)據(jù),以保證當天的數(shù)據(jù)報表展示正確。以手機號為例子,每天會處理新增的手機號客戶,但是不應(yīng)該包含昨天的手機號客戶數(shù)據(jù)。
2. 錯誤語句
DELETE
FROM
XXTable
WHERE
import_code IN ( 'CODE1', 'CODE2', 'CODE3' )
AND import_date = 20230202
AND mobile_no IN ( SELECT mobile_no FROM XXTable WHERE import_code IN ( 'CODE1', 'CODE2', 'CODE3' ) AND import_date = 20230201)
執(zhí)行sql會報錯:
You can‘t specify target table for update in FROM clause
其含義是:不能在同一表中查詢的數(shù)據(jù)作為同一表的更新數(shù)據(jù)
3. 正確語句
既然不能在同一表中的查詢數(shù)據(jù)作為更新數(shù)據(jù)源,那么只能通過臨時表的方式去做更新即可。
DELETE
FROM
XXTable
WHERE
import_code IN ( 'CODE1', 'CODE2', 'CODE3' )
AND import_date = 20230202
AND mobile_no IN ( SELECT BR. mobile_no FROM (SELECT TR. mobile_no FROM XXTable AS TR WHERE import_code IN ( 'CODE1', 'CODE2', 'CODE3' ) AND import_date = 20230201) AS BR)
4. 參考鏈接
- https://blog.csdn.net/qq_32727095/article/details/124492897
- https://blog.csdn.net/baidu_41553551/article/details/118178122?spm=1001.2101.3001.6650.5&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EOPENSEARCH%7ERate-5-118178122-blog-124492897.pc_relevant_recovery_v2&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EOPENSEARCH%7ERate-5-118178122-blog-124492897.pc_relevant_recovery_v2&utm_relevant_index=6