SQL Server跨表匹配校验后更新Daily_Proc表状态方法
问题背景
需要实现3条SQL处理规则:
- 从
Daily_Proc表读取满足CreatedDate = 06/06/2022 AND Status = Processed条件的记录 - 通过
MID和Source字段联合校验,判断记录是否存在于Lit_Hold_Err表中 - 若匹配存在,将
Daily_Proc表对应记录的Status字段值从Processed更新为Error-Retry
原有已写的SELECT查询存在两个问题:
- 日期条件写为
CreatedDate > '06/06/2022 0:00:00',会漏掉06/06/2022 0点整生成的记录,且如果字段带时分秒,直接用等值判断会漏判当天其他时间的记录 - 分开用
IN判断MID和Source是否存在于Lit_Hold_Err表,会出现字段错配:只要MID在表中出现过、Source也在表中出现过就会被判定为匹配,不需要两个字段属于同一条Lit_Hold_Err记录,不符合联合匹配的要求。
正确实现SQL
更新语句
采用EXISTS做两表联合匹配,逻辑严谨且性能优于多表关联/IN写法:
UPDATE Daily_Proc SET Status = 'Error-Retry' WHERE -- 日期区间判断,覆盖06/06/2022全天所有时间点的记录 CreatedDate >= '2022-06-06 00:00:00' AND CreatedDate < '2022-06-07 00:00:00' AND Status = 'Processed' -- MID+Source联合匹配Lit_Hold_Err表 AND EXISTS ( SELECT 1 FROM Lit_Hold_Err err WHERE err.MID = Daily_Proc.MID AND err.Source = Daily_Proc.Source )
提示:执行更新前建议先预览待更新的数据,避免误操作,预览只需将
UPDATE Daily_Proc SET Status = 'Error-Retry'替换为SELECT * FROM Daily_Proc即可。
按照给出的测试样例数据,执行上述语句后,仅会更新MID为KEKELO、Source为KEKELO@gmail.com的记录,其余记录不受影响,符合预期。
测试表样例数据
Daily_Proc表
| Hold | MID | Source | CreateDate | Status |
|---|---|---|---|---|
| JE | JELEEK | JELEEK@gmail.com | 06/03/2022 | New |
| KE | KEKELO | KEKELO@gmail.com | 06/06/2022 | Processed |
| ZE | ZEKEKE | ZEKEKE@gmail.com | 06/06/2022 | Processed |
Lit_Hold_Err表
| Hold | MID | Source | ErrorMessage |
|---|---|---|---|
| KE | KEKELO | KEKELO@gmail.com | "Not Found |
内容的提问来源于stack exchange,提问作者aase movie
相关产品推荐
相关产品推荐

