PostgreSQL - 使用generate_series()更新表中的行

时间:2016-06-17 07:21:51

标签: postgresql

我有下表:

create table test(
    id              serial primary key,
    firstname       varchar(32),
    lastname        varchar(64),
    id_desc         char(8)
);

我需要插入100行数据。获取名称没有问题 - 我有两个表,一个包含十行名字,另一个包含十个姓。通过执行插入 - 选择具有交叉连接的查询,我可以获得100行数据(10x10交叉连接)。

id_desc包含八个字符(固定大小是必需的)。它始终以相同的模式(例如abcde)开始,然后是001,002等,直到999.我试图用以下语句实现这一点:

update test set id_desc = 'abcde' || num.id
    from (select * from generate_series(1, 100) as id) as num
        where num.id = (select id from test where id = num.id);

语句执行但会影响零行。我知道where子句可能没有多大意义;我一直试图让这个工作起来,并开始尝试一些事情。虽然在这里发帖时不想省略它,因为我知道它肯定是必需的。

2 个答案:

答案 0 :(得分:1)

应该像

一样简单
UPDATE test SET id_desc = 'abcde' || to_char(id, 'FM099');

答案 1 :(得分:1)

Laurenz的建议很适合这个具体案例。我建议使用它。

其余部分是针对更为一般的情况,即简化不合适。

在我的测试中,这不起作用。

我认为你最好使用WITH子句和窗口函数。

WITH ranked_ids (id, rank) AS (
      select id, row_number() OVER (rows unbounded preceding)
        FROM test
)
update test set id_desc = 'abcde' || ranked_ids.rank
from ranked_ids WHERE test.id = ranked_ids.id;