SQL更新变量行数

时间:2015-11-12 23:02:40

标签: sql postgresql sql-update common-table-expression

我代表体育比赛的数据,每场比赛都有任意数量的阵容(基本上是球队),每个阵容中有任意数量的球员。

我有以下表格/列:

匹配(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可以解决这个问题吗?)

0 个答案:

没有答案