SQL多表关联UPDATE的WHERE子句未按预期过滤d.Tipo='AR'是何原因
问题根本原因
- 你当前的UPDATE语句存在关联条件缺失的核心问题:更新目标为
EstadoDoc表,但FROM子句中又重复声明了一次EstadoDoc并取别名e,你没有为更新目标表和别名e、以及Documentos表建立关联,这就导致更新逻辑出现了笛卡尔积匹配:只要关联查询中存在任意一行满足d.Tipo='AR'的记录,所有满足e.Estado IN ('A', 'RyR')、日期在2019周期范围内的EstadoDoc行都会被更新,完全忽略该行对应文档的Tipo类型。 - 这就是为什么IdDoc为012、000的AC类型记录也被误改:更新逻辑根本没有校验当前待更新的
EstadoDoc行对应的Documentos类型是否为AR。
修复方案
你需要补上EstadoDoc和Documentos的关联条件,推荐直接将更新目标表别名化,避免重复声明的问题,示例SQL如下:
UPDATE EstadoDoc e SET PuntajePrevio = 10 FROM Investigador i, Autores a, Documentos d, Periodo p WHERE i.IdInv = a.IdInv AND a.IdDoc = d.IdDoc AND d.Tipo = 'AR' AND e.IdDoc = d.IdDoc -- 新增关联:待更新的EstadoDoc行必须对应AR类型的文档 AND e.Estado IN ('A', 'RyR') AND p.FechaDesde <= e.FechaEst AND p.FechaHasta >= e.FechaEst AND p.IdPeriodo = 2019
也可以改用更易读、不容易漏写关联的显式JOIN语法:
UPDATE EstadoDoc e SET PuntajePrevio = 10 FROM Autores a INNER JOIN Investigador i ON i.IdInv = a.IdInv INNER JOIN Documentos d ON a.IdDoc = d.IdDoc INNER JOIN Periodo p ON p.FechaDesde <= e.FechaEst AND p.FechaHasta >= e.FechaEst WHERE d.Tipo = 'AR' AND e.Estado IN ('A', 'RyR') AND p.IdPeriodo = 2019
内容的提问来源于stack exchange,提问作者alex schobel
相关产品推荐
相关产品推荐

