在 Postgresql 中创建一个视图,其中每个父值使用一行,并以逗号分隔所有子值的串联列表

问题描述 投票:0回答:1

我有两个表,位置和图层(土壤层),我试图弄清楚如何创建一个视图,其中每个位置一行,一列列出该位置的所有土壤层,在 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 中创建一个动态视图,我可以使用它来生成符号系统,以便根据现有的图层来测试位置,但无法识别具有类似输出的表达式.

postgresql concatenation aggregate
1个回答
0
投票

以下查询演示了如何使用

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 函数熟悉程度的人推荐的一种方法是每天练习一个函数(或者可能是一组密切相关的函数),就像人们可以使用每日单词日历来扩展词汇量一样.

© www.soinside.com 2019 - 2024. All rights reserved.