我有两个表,位置和图层(土壤层),我试图弄清楚如何创建一个视图,其中每个位置一行,一列列出该位置的所有土壤层,在 Postgresql 中用逗号分隔。 家长表(地点)
loc_id | 地点 |
---|---|
1 | 图1 |
2 | 图2 |
子表(层)
lyr_id | loc_id | 层 |
---|---|---|
1 | 1 | A |
2 | 1 | 阿普 |
3 | 1 | B |
4 | 2 | A |
5 | 2 | 填写1 |
6 | 2 | 填2 |
7 | 2 | B |
期望的输出
地点 | 层 |
---|---|
图1 | A、Ap、Apb |
图2 | A、填充 1、填充 2、B |
我是一个菜鸟,在QGIS中使用relation_aggregate函数完成了这个,但结果是静态的。在 QGIS 中,该函数使用表之间的关系和 concatenate 函数来生成逗号分隔的列表(例如,relation_aggregate(relation:='lyr_aggr',aggregate:='concatenate',expression:="layer", concatenator:= ', ')。我希望能够在 postgres 中创建一个动态视图,我可以使用它来生成符号系统,以便根据现有的图层来测试位置,但无法识别具有类似输出的表达式.
以下查询演示了如何使用
STRING_AGG
生成由多行聚合而成的逗号分隔值列表:
WITH
locations(loc_id, location) AS (
VALUES (1, 'TU 1'),
(2, 'TU 2')
),
layers(lyr_id, loc_id, layer) AS (
VALUES (1, 1, 'A'),
(2, 1, 'Ap'),
(3, 1, 'B'),
(4, 2, 'A'),
(5, 2, 'Fill 1'),
(6, 2, 'Fill 2'),
(7, 2, 'B')
)
SELECT locations.location,
STRING_AGG(layers.layer, ', ' ORDER BY layers.lyr_id) AS layer
FROM locations
LEFT OUTER JOIN layers
ON locations.loc_id = layers.loc_id
GROUP BY locations.location
ORDER BY locations.location;
PostgreSQL 文档 是一个非常好的资源。我向那些有兴趣扩大对 PostgreSQL 函数熟悉程度的人推荐的一种方法是每天练习一个函数(或者可能是一组密切相关的函数),就像人们可以使用每日单词日历来扩展词汇量一样.