我试图用同一表中的数据填充表中的空行。这是我的代码:
create table public.testdata(
id INTEGER,
person INTEGER,
name varchar(10));
insert into testdata (id, person,name) VALUES ( 1,1,'Jane' ), ( 2,1,'Jane' ), ( 3,1,NULL ), ( 4,2,'Tom' ), ( 5,2,NULL );
select * from testdata;
在此处输入图像描述
基本上,我希望名字"简"在第三排,名字"汤姆"在第五排。
这是我在网上找到的一个类似问题的答案:
Update testdata
SET name = COALESCE(a1.name, b1.name)
FROM testdata a1
JOIN testdata b1
on a1.person = b1.person
and a1.id <> b1.id
where a1.name is NULL;
但如果我运行这个代码,我会在每一列中得到名字"Jane",这不是我想要的。我感谢任何帮助和建议。
示例:
select t1.id, t1.person, t2.name from testdata t1
left join
(
select distinct person, name from testdata
where name is not null
) t2 on t1.person = t2.person
通过CTE获取人员(id?(和所需姓名。然后使用结果更新名称。因此(见演示(:
with namer (person, name) as
( select distinct on (person)
person, name
from testdata
where name is not null
order by person, name
)
update testdata d1
set name = (select n1.name
from namer n1
where n1.person = d1.person
)
where d1.name is null;
注意:Demo包含额外的行,其中行的输入顺序不理想。并不是所有的person值都有关联的名称。