问题描述
我希望我不要问真正愚蠢的事情,我确实搜索过是否曾经回答过这样的问题,并且没有发现任何结论性的东西。
这些是创建有问题的两个表的语句:
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 ;
但这显然行不通。
非常感谢您的帮助和见解!
解决方法
您可以使用子查询来获取该信息:
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)