我在PostgreSQL中有一个表,其中包含:
id name arrayofparents 1 First 2 Second {1} 3 Second_Sec {1,2} 4 Third {1,2,3} 5 Second_A {1} 6 Other 7 Trash {6}
arrayofparents是类型,integer[]它包含具有正确顺序的该行的父记录列表。
arrayofparents
integer[]
id=4家长:First然后Second再 Second_sec
id=4
First
Second
Second_sec
如何编写一个查询,该查询对于任何给定的ID都会生成其父母姓名的字符串?
例如:
id=3:First->Second。
id=3
First->Second
id=4:First->Second->Second_sec。
First->Second->Second_sec
id=7:Other。
id=7
Other
编辑: 如果可能的话,我希望请求的IDname总是会出现。 id=3:First->Second->Second_sec。
name
id=4:First->Second->Second_sec->Third。
First->Second->Second_sec->Third
id=7:Other->Trash。
Other->Trash
id=6:Other。
id=6
您可以结合使用诸如generate_subscripts和array之类的多项操作来获得结果:
with mtab as ( SELECT id, name, array_append(arrayofparents,id) as arrayofparents, generate_subscripts(array_append(arrayofparents, id), 1) AS p_id FROM tab where id=2 ) select distinct array_to_string( array( select tab.name from tab join mtab t on tab.id=t.arrayofparents[t.p_id] ), '->' ) ;
实时示例Sqlfiddle
或将外部联接与以下任何一项结合使用:
SELECT coalesce(string_agg(p.name, '->') || '->' || t.name, t.name) AS parentnames FROM tab AS t LEFT JOIN tab AS p ON p.id = ANY(t.arrayofparents) where t.id =7 GROUP BY t.id, t.name