You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用子查询更新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

火山引擎 最新活动