sql - 在 PostgreSQL 上使用特定值更新所有受影响的行

标签 sql postgresql

我有下表的简化版本。每行都有一个按其parent_id 分区的item_order 值。

<表类=“s-表”> <标题> item_id 项目名称 parent_id item_order <正文> 523 鱼 1 1 562 蠕虫 1 2 612 老鼠 1 3 251 奶酪 1 4 723 番茄酱 2 1 912 面食 2 2 52 芯片 2 3

假设我想将“mice”的“item_order”值设置为 1。

UPDATE
    my_table 
SET
    item_order = 1
    WHERE item_id = 612;

我需要更新表格如下。 (突出显示了预期的更改。)

<表类=“s-表”> <标题> item_id 项目名称 parent_id item_order <正文> 612 老鼠 1 3 → 1 523 鱼 1 1 → 2 562 蠕虫 1 2 → 3 251 奶酪 1 4 723 番茄酱 2 1 912 面食 2 2 52 芯片 2 3

如何更新同一 Parent_id 内所有受影响行的 item_order 值?

最佳答案

您可以通过更新从要移动的 item_id 获取 item_order 来完成此操作。

只有低于已更改订单的订单也需要移动。

UPDATE my_table t
SET item_order =
     case 
     when t.item_order = t2.item_order then 1
     when t.item_order < t2.item_order then t.item_order + 1
     else t.item_order
     end
FROM my_table t2
WHERE t.parent_id = t2.parent_id
  AND t.item_order <= t2.item_order
  AND t2.item_id = 612;
3 rows affected
select *
from my_table
order by parent_id, item_order
<表类=“s-表”> <标题> item_id item_name parent_id item_order <正文> 612 鼠标 1 1 523 鱼 1 2 562 蠕虫 1 3 251 奶酪 1 4 723 番茄酱 2 1 912 意大利面 2 2 52 芯片 2 3

db<>fiddle 上的演示 here

关于sql - 在 PostgreSQL 上使用特定值更新所有受影响的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70632674/

相关文章:

sql - 彼此独立地订购联合的两个部分

mysql - 如何使用子查询的结果

performance - 基准 : bigint vs int on PostgreSQL

arrays - PostgreSQL:将列和行合并到数组中

sql - 如何在 SELECT INTO 之后保留数据类型?

mysql - 黑名单/白名单表设计

mysql - 相关名称在内部查询中如何工作?

ruby-on-rails - PostgreSQL 和 Lion - 路径

python - 在 Django View 中将用户/帐户表添加到 Postgres

hibernate - 在hibernate中,如何利用数据库时间?