按特定顺序更新

时间:2019-06-07 20:08:10

标签: postgresql

所以说我有一张桌子:

SELECT classlist, classcount FROM subgroupstest WHERE classlist LIKE '%_10_%'  AND classlist NOT REGEXP '_3_|_15_'

我想更改ord,使其与“ order by name”子句的字母顺序化结果相匹配。因此,我的目标是:

SELECT * from test_table order by name;
----|----
name|ord
----|----
a   |4
a   |5
b   |2
c   |3
d   |1

Postgres中有一个很好的方法吗?我有一个新的序列可以借鉴,我不确定如何就地进行清理,或者是否有可能。还是我应该只存储选择的结果,然后遍历并选择每个名称,为它们分配一个新的ord值? (它们都有唯一的ID,因此重复无所谓)

1 个答案:

答案 0 :(得分:1)

您不需要任何顺序。

第一步是确定新数据:

SELECT
  *
 FROM test_table AS test_table_old
 LEFT JOIN (
  SELECT
    *, row_number() OVER () AS ord_new
   FROM test_table
   ORDER BY name, ord
  ) AS test_table_new USING (name, ord)
;

然后将其转换为更新:

UPDATE test_table SET
  ord = test_table_new.ord_new
 FROM test_table AS test_table_old
 LEFT JOIN (
  SELECT
    *, row_number() OVER () AS ord_new
   FROM test_table
   ORDER BY name, ord
  ) AS test_table_new USING (name, ord)
 WHERE (test_table.name, test_table.ord) = (test_table_old.name, test_table_old.ord)
;

如果需要新序列,则将“ row_numer()OVER()”替换为“ nextval('the_new_sequence_name')”。