所以说我有一张桌子:
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,因此重复无所谓)
答案 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')”。