我有下表:
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子句可能没有多大意义;我一直试图让这个工作起来,并开始尝试一些事情。虽然在这里发帖时不想省略它,因为我知道它肯定是必需的。
答案 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;