SQL Concat 子查询

标签 sql postgresql subquery concatenation

我希望“user_names”是一个用户列表,但我无法将多个子查询项分配给“user_names”。如果子查询只返回 1 个项目,它会起作用,但如果它返回多个,则不起作用。

床头柜
[编号]
[1]
[2]
[3]

分配表:
[id, bed_id, user_id]
[1, 1, 1]
[2, 1, 2]

用户表:
[id, '用户名']
[1, '约翰·史密斯']
[2, '李四']

    sql = "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 进行硬编码并运行此段以获取姓名列表。它没有用:

    sql = """
        (
        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']

最佳答案

您的查询的一个问题是您按应用 array_agg 的列进行分组。如果你删除组,你会得到 "{"John Smith","Jane Doe"}",但你仍然会缺少 bed 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;""

关于SQL Concat 子查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31930905/

相关文章:

mysql - SQL查询中子查询的语法和逻辑

php - SQL 当用户选择一个数据时,其他数据也会被选择

sql - Postgresql:将列子集和子查询结果组装成 JSON 文档

postgresql - 将表从本地主机复制到远程服务器?

postgresql - 如何减少存储(缩小)我的 RDS 实例?

python-3.x - 软件包安装失败 - OsX 中的 psycopg2

mysql - 当表之间没有物理连接时优化 SQL 查询

mysql - 另一个 SQL 询问

MySQL 多条件多表查询

sql - 查询中的查询 : Is there a better way?