我对SQL很新,并尝试根据3个非常大的数据库表计算新字段。这是一个抽象:
我想在游戏表中添加一个字段,其中包含玩家在锦标赛当年的年龄的十进制表示。
我是否需要编写一个过程/操作循环来完成此操作?或者有更新查询的方法吗?
答案 0 :(得分:1)
您可以使用UPDATE语句执行此操作。 (但是,你真的想要吗?)
首先,编写可以提供结果的untitled
语句。
SELECT
只需添加一个表达式即可执行您要执行的计算,并将其作为列返回。
然后,您可以将该SELECT语句用作UPDATE语句中的内联视图。假设您已在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
表
age_in_days
列
games
接下来,我们必须关注"大"表,并避免产生大量回滚的巨大事务(如果这些是InnoDB表)。
如果这是一个问题,请在"批次"中进行更新操作。通过在内联视图查询中添加谓词(例如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
,并为每个WHERE g.player_id = 42
运行相同的UPDATE一次来分解它。
如果你希望年龄在"十进制年份",你需要开发一个表达式来返回它。 (作为一个基本的近似值,将天数差异除以一年中的天数player_id
。这会让你非常接近。)
(在我回答的开头,我问道,你真的想要吗。
请注意,如果更新了播放器365.25
值,或更改了birthday
,则tournament_date
表中存储的计算值将不一致。
答案 1 :(得分:0)
你可以试试这个
Update games
set age = (SELECT FLOOR(DATEDIFF(DAY, players.BirthDate, tournaments.datetime) / 365.25) from players,tournaments)
where players.id=games.id;