1

假设我们有这两张表:person 和 car

CREATE TABLE person (
    id BIGSERIAL NOT NULL PRIMARY KEY,
    name VARCHAR NOT NULL
);
CREATE TABLE car (
    id BIGSERIAL NOT NULL PRIMARY KEY,
    make VARCHAR NOT NULL,
    person_id BIGINT NOT NULL REFERENCES person(id)
);

我试图做的是找到所有人,找到每辆车并创建一系列像这样的对象

[
    {
        "id": "PERSON_ID",
        "name": "PERSON_NAME",
        "cars": [
            {
                "id": "CAR_ID",
                "model": "MODEL_NAME",
                "person_id": "PERSON_ID"
            }
        ]
    }
]

我曾尝试将AS别名与表中的表一起使用JOIN,但它不起作用。有没有办法做到这一点?谢谢!personcar

4

2 回答 2

1

如果要将结果集作为 Postgres 中的数组,可以使用:

select p.*, array_agg(c)
from person p join
     car c
     on c.person_id = p.id
group by p.id;

如果您也希望返回 JSON,您可以执行类似的操作。

于 2021-07-05T17:32:52.800 回答
1

您可以尝试以下方法。看一个工作小提琴:

架构 (PostgreSQL v13)

CREATE TABLE person (
    id BIGSERIAL NOT NULL PRIMARY KEY,
    name VARCHAR NOT NULL
);

CREATE TABLE car (
    id BIGSERIAL NOT NULL PRIMARY KEY,
    make VARCHAR NOT NULL,
    person_id BIGINT NOT NULL REFERENCES person(id)
);

insert into person(name) values ('tom'),('harry');

insert into car (id,make,person_id) values (1,'ford',1),(2,'audi',1),(3,'nissan',2);

查询 #1

SELECT
   p.id,
   p.name,
   array_agg(row_to_json(c)) cars
FROM
   person p
INNER JOIN
   (SELECT id, make model, person_id FROM car) c ON p.id = c.person_id
GROUP BY
   p.id,
   p.name;
ID 姓名 汽车
1 汤姆 [{"id":1,"model":"ford","person_id":1},{"id":2,"model":"audi","person_id":1}]
2 哈利 [{"id":3,"model":"nissan","person_id":2}]

在 DB Fiddle 上查看

于 2021-07-05T17:33:42.423 回答