如何基于不同表的多列索引的匹配来更新表

时间:2020-08-11 14:34:21

标签: postgresql sql-update database-indexes

我希望我不要问真正愚蠢的事情,我确实搜索过是否曾经回答过这样的问题,并且没有发现任何结论性的东西。

这些是创建有问题的两个表的语句:

CREATE TABLE race (
    id INT PRIMARY KEY, --raceId
    year INT,
    round INT,
    circuit_id INT REFERENCES circuit (id) 
        ON DELETE RESTRICT ON UPDATE CASCADE,
    name CITEXT,
    date DATE,
    time TIME,
    url CITEXT
)
;

ALTER TABLE race ADD COLUMN season_last_round BOOL;
UPDATE race SET season_last_round = False;

CREATE TABLE 
season_last_round AS 
    SELECT  
        year, 
        max(round) AS last_round
    FROM race
    GROUP BY year
    ORDER BY year
    ;

所以我真正想要实现的是,如果实际上是season_last_round上的True,则将max(round)设为year

然后我的方法是在两个表上创建多列索引

CREATE INDEX season_lr_year_last_round ON season_last_round (year, last_round);

CREATE INDEX race_year_round ON race (year, round);

做类似...。

UPDATE race
SET season_last_round = True
WHERE 
season_lr_year_last_round = race_year_round ;

但这显然行不通。

非常感谢您的帮助和见解!

1 个答案:

答案 0 :(得分:1)

您可以使用子查询来获取该信息:

UPDATE race
  SET season_last_round = true
FROM (
  SELECT year, max(round) AS last_round
  FROM race
  GROUP BY year
) t 
WHERE t.year = race.year
  and t.last_round = race.round;

另一个选择是使用IN的子查询:

UPDATE race
  SET season_last_round = true
WHERE (year, round) IN (SELECT year, max(round) AS last_round
                        FROM race
                        GROUP BY year)
相关问题