使用子查询更新SQL表时表别名t1无法识别的技术问题
解决UPDATE语句中无法识别子查询别名的问题
嘿,我一眼就看出你的问题啦——子查询里定义的别名t1只能在子查询内部生效,外部的UPDATE语句根本认不出它,这就是为啥系统报错找不到t1.rDate这类字段的原因!接下来给你两种靠谱的修正方案,都能完美匹配你的需求:
方案一:用关联子查询精准匹配分组
把子查询改成和外部表关联的模式,让子查询针对当前行的分组(相同日期、时间、赛道)去统计数量:
UPDATE Results SET odds4 = ( SELECT SUM(IIF(odds >= 4, 1, 0)) FROM Results t1 -- 让子查询只统计和当前行同组的记录 WHERE t1.rDate = Results.rDate AND t1.rTime = Results.rTime AND t1.rTrack = Results.rTrack ) WHERE rDate >= #2019/05/28#;
这个写法会给Results表里的每一行,找到和它同组的所有记录,统计其中odds >=4的数量,然后把这个数赋值给该行的odds4字段,完全符合你示例数据里的结果。
方案二:先分组统计再JOIN更新(效率更高)
如果你的数据量比较大,这种方式的执行效率会更好——先提前算出每个分组的统计值,再通过JOIN匹配到原表对应的行来更新:
UPDATE r SET r.odds4 = t.odds_count FROM Results r INNER JOIN ( -- 先按分组统计好每个组的符合条件的数量 SELECT rDate, rTime, rTrack, SUM(IIF(odds >=4,1,0)) AS odds_count FROM Results WHERE rDate >= #2019/05/28# GROUP BY rDate, rTime, rTrack ) t ON r.rDate = t.rDate AND r.rTime = t.rTime AND r.rTrack = t.rTrack;
用这个语句,子查询t会先把每个分组的odds>=4的数量算出来,再和原表r通过分组字段匹配,直接把统计值赋值给odds4。
对应你的示例数据验证
拿你给的例子来看:
- 2019/05/28 13:00 Ascot这组里,
odds>=4的是horse2(34)、horse4(6)、horse5(4),一共3条,所以odds4会被设为3,和示例结果一致; - 2019/05/28 14:30 Epsom这组里,符合条件的是horse4(12)、horse5(66),共2条,
odds4就会被设为2,完全符合预期。
内容的提问来源于stack exchange,提问作者user2096512




