SQL 连接子查询

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

我希望“user_names”成为用户列表,但我无法将多个子查询项分配给“user_names”。如果子查询仅返回 1 项,则有效,但如果返回多项,则无效。

床头桌

id
 1
 2
 3

分配表:

id bed_id user_id
 1      1       1
 2      1       2

用户表:

id    user_name
 1 'John Smith'
 2   'Jane Doe'
SELECT
    b.id,
    (
        SELECT
            u.user_name
        FROM
            assignments AS a
        INNER JOIN
            users as u
        ON
            a.user_id = u.id
        WHERE a.bed_id = b.id
    ) AS user_names
FROM beds AS b

期望的结果是:

[1, 'John Smith, Jane Doe']
[2,                     '']
[3,                     '']

我尝试对床 ID 进行硬编码并运行此段以获取名称列表。没有成功:

SELECT
    array_agg(user_name)
FROM
    roomchoice_assignment AS a
INNER JOIN
    roomchoice_customuser as u
ON
    a.user_id = u.id
WHERE
    a.bed_id = 1
GROUP BY user_name

它返回以下内容:

[
    [
        [
            "John Smith"
        ]
    ], 
    [
        [
            "Jane Doe"
        ]
    ]
]

我一直希望这样:

['John Smith, Jane Doe']
sql postgresql subquery concatenation
1个回答
11
投票

您的查询的一个问题是您正在按应用 array_agg 的列进行分组。如果您删除组,您将得到

"{"John Smith","Jane Doe"}"
,但您仍然会缺少床 id 列,如果您想要所有床的列表,即使没有分配,您也应该使用左连接而不是子查询(这也性能和可读性应该更好)。

您可以使用

string_agg
,如重复问题所示。

此查询:

SELECT b.id, string_agg(u.user_name, ', ') users
FROM beds AS b
LEFT JOIN assignment AS a ON a.bed_id = b.id
LEFT JOIN users as u ON a.user_id = u.id
GROUP by b.id;

会给你这样的结果:

1;"John Smith, Jane Doe"
2;""
3;""
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.