我代表体育比赛的数据,每场比赛都有任意数量的阵容(基本上是球队),每个阵容中有任意数量的球员。
我有以下表格/列:
匹配(id,start_time)
match_lineup (id,match_id,score)
lineup_players (id,lineup_id,player_id) - 其中lineup_id是match_lineup.id上的外键
玩家(id,name)
我的问题是关于更新 lineup_players 表。与每个阵容相关联的球员数量(lineup_id)是可变的。
当lineup_players所需的UPDATE具有相同的行数(播放器)时,我可以执行以下操作:
WITH new_lineup (rn, new_player_id) AS (
VALUES
(1, 5), -- assuming their are 5 players on the old_lineup and 5 players on new_lineup
(2, 6),
(3, 4),
(4, 8),
(5, 7)),
old_lineup AS (
SELECT (id, lineup_id, player_id, row_number() OVER (ORDER BY id) rn)
FROM lineup_players
WHERE lineup_id = 10), -- Update lineup of lineup_id = 10
UPDATE lineup_players
SET player_id = new_player_id
FROM new_lineup
JOIN old_lineup USING (rn)
当与阵容(lineup_id)相关联的行数(玩家)在更新时发生变化时,这将无效。
我可以通过简单地删除具有给定lineup_id的所有行然后再次插入新玩家来完成此操作,但这看起来有点脏。
我确信这是SQL中已解决的问题,但我无法在线找到解决方案。
我正在使用postgres,如果这有任何区别(在9.5中使用UPSERT可以解决这个问题吗?)