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

问题描述

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

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

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)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...