如何根据不同 table 的多列索引的匹配来更新 table
How to UPDATE a table based on the matches of multi-column indexes of different tables
我希望我不是在问一些非常愚蠢的问题,我确实搜索了以前是否已经回答过这样的问题,但没有找到任何结论。
这些是创建有问题的两个表的语句:
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
如果它实际上是 year
上的 max(round)
。
然后我的方法是在两个表上创建多列索引
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 ;
但这显然行不通。
非常感谢你们的帮助和见解!
您可以使用 sub-query 获取该信息:
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;
另一种选择是 sub-query 使用 IN:
UPDATE race
SET season_last_round = true
WHERE (year, round) IN (SELECT year, max(round) AS last_round
FROM race
GROUP BY year)
我希望我不是在问一些非常愚蠢的问题,我确实搜索了以前是否已经回答过这样的问题,但没有找到任何结论。
这些是创建有问题的两个表的语句:
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
如果它实际上是 year
上的 max(round)
。
然后我的方法是在两个表上创建多列索引
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 ;
但这显然行不通。
非常感谢你们的帮助和见解!
您可以使用 sub-query 获取该信息:
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;
另一种选择是 sub-query 使用 IN:
UPDATE race
SET season_last_round = true
WHERE (year, round) IN (SELECT year, max(round) AS last_round
FROM race
GROUP BY year)