【问题标题】:How to UPDATE a table based on the matches of multi-column indexes of different tables如何根据不同表的多列索引的匹配来更新表
【发布时间】:2020-08-11 14:34:21
【问题描述】:

我希望我不是在问一些非常愚蠢的问题,我确实搜索过这样的问题是否已经被回答过并且没有找到任何结论性的东西。

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

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 ;

但这显然行不通。

非常感谢你们的帮助和见解!

【问题讨论】:

    标签: postgresql sql-update database-indexes


    【解决方案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)
    

    【讨论】:

    • 非常感谢!像魅力一样工作!第二个选项很简洁,因为season_last_round 表没有理由存在,因此我将其删除。架构越清晰越好。
    • @Luis:第一个也不创建表
    猜你喜欢
    • 2022-06-15
    • 2020-11-17
    • 1970-01-01
    • 2017-01-09
    • 1970-01-01
    • 2023-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多