Sql 使用第三列中的预设值添加内部联接列

Sql 使用第三列中的预设值添加内部联接列,sql,postgresql,concatenation,aggregate-functions,Sql,Postgresql,Concatenation,Aggregate Functions,我有三张桌子。线索、笔记和用户 leads - id - name notes - id - lead_id - content - user_id users - id - name 我想构造一个查询来返回包含两列的新表 Lead name | Notes John | Mary - Note 1 ### John - Note 2 第一列很简单。每个线索都有一个名字。然而,第二列是一个棘手的问题。我想将所有注释聚合到一列,并添加注释作者姓名的前缀 我用第二列编写了一个查询,

我有三张桌子。线索、笔记和用户

leads
- id
- name

notes
- id
- lead_id
- content
- user_id

users
- id
- name
我想构造一个查询来返回包含两列的新表

Lead name | Notes
John      | Mary - Note 1 ### John - Note 2
第一列很简单。每个线索都有一个名字。然而,第二列是一个棘手的问题。我想将所有注释聚合到一列,并添加注释作者姓名的前缀

我用第二列编写了一个查询,其中包含聚合注释

 SELECT leads.name AS name,
        string_agg(notes.content, ' ### ') AS leads_notes,
 FROM leads
 INNER JOIN notes ON notes.lead_id = leads.id
 GROUP BY leads.id

但是注释的作者姓名(
users.name
)我不知道如何查询。

您的引用有误导性。单引号不用于标识符。
你的连接也是扭曲的。您不能直接将用户加入潜在客户<代码>线索没有
用户id

SELECT ls.name
      , string_agg(concat_ws(' - ', u.name, n.content)
                  , ' ### ') AS leads_notes
FROM   leads l
JOIN   notes n ON n.lead_id = l.id
JOIN   users u ON u.id = n.user_id
GROUP  BY l.id;
固定的基本结构

名称
内容
与(同一行中的多个值)连接在一起,然后再使用
string\u agg()
进行聚合(跨行多个值)

如果定义了
users.name
notes.content
notnull
,则您可以直接连接:

u.name || ' - ' || n.content
详情:

您还可能希望以非任意方式对每个潜在客户的元素进行排序:

string_agg( ... ORDER BY u.name, u.id)
string\u agg(…按u.name、u.id排序)