我对SQL还是很陌生,并试图根据3个非常大的数据库表来计算一个新字段。这是一个抽象:
我想在游戏表中添加一个字段,其中包含比赛当天玩家年龄的十进制表示。
我是否需要编写一个过程/操作循环来完成此任务?还是可以通过更新查询来做到这一点?
您可以使用UPDATE语句执行此操作。(但是,您真的想要吗?)
首先,编写SELECT
将为您提供结果的语句。
SELECT g.player_id
, g.tournament_id
, p.birthday
, t.tournament_date
, DATEDIFF(t.tournament_date,p.birthday) AS days_diff
FROM games g
JOIN player p ON p.id = g.player_id
JOIN tournament t ON t.id = g.tournament_id
只需添加一个执行您要执行的计算的表达式,然后将其作为列返回即可。
然后,您可以将该SELECT语句用作UPDATE语句中的内联视图。假设您已age_in_days
在games
表格中添加一列
UPDATE games d
JOIN (
SELECT g.player_id
, g.tournament_id
, p.birthday
, t.tournament_date
, DATEDIFF(t.tournament_date,p.birthday) AS days_diff
FROM games g
JOIN player p ON p.id = g.player_id
JOIN tournament t ON t.id = g.tournament_id
) s
ON s.player_id = d.player_id
AND s.tournament_id = d.tournament_id
SET s.age_in_days = s.days_diff
接下来,我们必须关注“大”表,并避免产生会产生大量回滚的巨大事务(如果这些表是InnoDB表)。
如果这是一个问题,请通过在行视图查询中添加谓词(例如)并对其进行细分来进行“批处理”中的UPDATE操作WHERE g.player_id = 42
,然后对每个UPDATE运行一次player_id
。
如果您希望年龄以“十进制年”为单位,则需要开发一个表达式以返回该值。(作为基本的近似值,将天数的差除以一年中的天数365.25
。这会使您非常接近。)
(在回答开始时,我问道,您真的要这么做吗?
请注意,如果birthday
更新了玩家值或tournament_date
更改了a ,则games
表中存储的计算值将不一致。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句