我有一个包含层次结构 (ltree) 的 postgres 表:
| hierarchy |
|-----------|
| A |
| A.X |
| A.X.Y. |
| A.X.Y.Z |
| A.B |
| A.B.C |
| A.B.C.D |
| A.B.C.D.E |
和结果表:
| marker | tier | hierarchy |
|:------:|:----:|:---------:|
| 1 | 1 | A |
| 1 | NULL | A.X.Y |
| 1 | 2 | A.X |
| 1 | NULL | A.B.C.D.E |
| 1 | 4 | A.B.C |
| 1 | NULL | A |
| 2 | NULL | A.B |
| 2 | NULL | A.B.C |
我想创建一个视图,将层列中的 NULL 值替换为最近的非 NULL 祖先层(即父层 - 如果父层为空,查看祖父母的层等,一直回到根如有必要)用于相关标记。
此示例的输出视图如下所示:
| marker | tier | hierarchy |
|:------:|:----:|:---------:|
| 1 | 1 | A |
| 1 | 2 | A.X.Y |
| 1 | 2 | A.X |
| 1 | 4 | A.B.C.D.E |
| 1 | 4 | A.B |
| 1 | 1 | A |
| 2 | NULL | A.B |
| 2 | NULL | A.B.C |
你能帮忙吗?
这可能看起来像是自我的工作
LEFT JOIN
,但连接条件并不是那么明确——它实际上需要从多个可能的祖先中选择“最接近的”。用子查询更容易表达:
CREATE VIEW nice_results AS
SELECT
marker,
COALESCE(tier, (
SELECT tier
FROM results AS ancestor
WHERE ancestor.marker = node.marker
AND ancestor.tier IS NOT NULL
AND ancestor.hierarchy @> node.hiearchy
ORDER BY nlevel(ancestor.hiearchy) DESC
LIMIT 1
)) AS tier,
hierarchy
FROM results AS node