【问题标题】:Update select using the max of one column Postgresql使用一列 Postgresql 的最大值更新选择
【发布时间】:2018-04-10 10:27:31
【问题描述】:

所以我正在更改数据库结构。我正在将一列“大小”从 table_B 移动到 table_A。 Table_B 可以有多个引用 table_A.a_id 的条目

我想用具有最高 b_id 的行从 table_B 更新 table_A 中的新“大小”列。

所以我可以使用 Max() 和 group by 为每个 a_id 选择最高的 b_id。

SELECT max(b_id)
FROM table_B
GROUP BY a_id;

但我不确定如何将其与更新选择相匹配

UPDATE table_A
SET table_A.size = table_B.size
FROM table_A, table_B
WHERE table_A.a_id = table_B.a_id
AND table_B.b_id = 
(
    max...
);

编辑: 我现在意识到这实际上不是更新选择,我的第一次尝试是

table_B 的外观和 table_A 中的预期结果

table_A
a_id        | size
-------------------------
1           | 5678
2           | 456

table_B
b_id        | a_id       | size
--------------------------------------
1           | 1          | 1234
2           | 1          | 5678
3           | 2          | 456

【问题讨论】:

  • 不要from子句中重复目标表。
  • 尝试先用 group by 选择 CTE,然后 update from CTE where ?..
  • 样本数据和期望的结果真的很有帮助。

标签: sql postgresql


【解决方案1】:

首先,写一个select得到你想要的大小:

select distinct on (b.a_id) b.a_id, b.size
from tableb b
order by b.a_id, b.b_id desc;

接下来,将其合并到update

update tablea a
    set size = b.size
    from (select distinct on (b.a_id) b.*
          from tableb b
          order by b.a_id, b.b_id desc
         ) b
    where a.a_id = b.a_id;

【讨论】:

    【解决方案2】:

    你可以试试下面的查询

    UPDATE table_A 
    SET table_A.size = 
        ( SELECT table_B.size
          FROM table_B B1
          WHERE table_A.a_id = B1.a_id AND
          B1.b_id = (SELECT max(b_id) FROM table_B B2 WHERE table_A.a_id=B2.a_id))
    

    【讨论】:

    • table_A 不引用 table_B。 table_B 引用 table_A。所以 table_A.b_id 不存在
    • 你不能像这样在set 子句中引用table_b
    猜你喜欢
    • 2018-10-06
    • 1970-01-01
    • 2018-08-25
    • 1970-01-01
    • 1970-01-01
    • 2020-08-19
    • 2021-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多