使用带有 TypeORM 的 JSONB 的 PostgreSQL 连接
PostgreSQL joining using JSONB with TypeORM
我有这个SQL
CREATE TABLE product(id SERIAL PRIMARY KEY, name text, categories JSONB);
INSERT INTO product(name, categories) VALUES
('prouct1', '{"ids":[4,5]}'),
('prouct2', '{"ids":[5,6]}'),
('prouct3', '{"ids":[7]}');
CREATE TABLE category(id bigint, rootid bigint);
INSERT INTO category(id, rootid) VALUES
(1, null),
(2, null),
(3, null),
(4, 1),
(5, 2),
(6, 1),
(7, 3);
我想用 TypeORM 做这个查询。但是我不知道如何使 jsonb_array_elements_text(b.categories->'ids') pc(categoryid) ON TRUE
成为 TypeORM 的一部分。
SELECT p.id, p.name, p.categories
FROM product p
INNER JOIN jsonb_array_elements_text(b.categories->'ids') pc(categoryid) ON TRUE
INNER JOIN category c ON pc.categoryid = c.categoryid AND c.rootid = 1000;
或者,我正在尝试另一个查询。但是当我输入 jsonb_array_elements_text(categories->'ids')
时它太慢了。为什么会这样?
SELECT p.id, p.name, p.categories
FROM product p
INNER JOIN (SELECT id, jsonb_array_elements_text(categories->'ids') categoryid FROM product) pc ON p.id = pc.id
INNER JOIN category c ON pc.categoryid = c.categoryid AND c.rootid = 1000;
在 PostgreSQL 中,JSON
和 JSONB
类型有额外的索引类型 GIN
。为获得最佳性能,您必须为此 JSON 字段创建索引。
例如:
CREATE INDEX product_category_json_index ON product USING gin (categories jsonb_path_ops);
我为您写了一个替代查询:
select main.*, cat.* from
(
select p.*, jsonb_array_elements((categories->'ids'))::integer as category_id
from product p
) main
inner join examples.category cat on cat.id = main.category_id;
我想获得更详细的信息,对于这些表,如果你知道那么请告诉我这两个表中有多少条记录(product
和category
)
我想将示例数据(相同计数)插入到我的本地表中以进行测试和分析
我有这个SQL
CREATE TABLE product(id SERIAL PRIMARY KEY, name text, categories JSONB);
INSERT INTO product(name, categories) VALUES
('prouct1', '{"ids":[4,5]}'),
('prouct2', '{"ids":[5,6]}'),
('prouct3', '{"ids":[7]}');
CREATE TABLE category(id bigint, rootid bigint);
INSERT INTO category(id, rootid) VALUES
(1, null),
(2, null),
(3, null),
(4, 1),
(5, 2),
(6, 1),
(7, 3);
我想用 TypeORM 做这个查询。但是我不知道如何使 jsonb_array_elements_text(b.categories->'ids') pc(categoryid) ON TRUE
成为 TypeORM 的一部分。
SELECT p.id, p.name, p.categories
FROM product p
INNER JOIN jsonb_array_elements_text(b.categories->'ids') pc(categoryid) ON TRUE
INNER JOIN category c ON pc.categoryid = c.categoryid AND c.rootid = 1000;
或者,我正在尝试另一个查询。但是当我输入 jsonb_array_elements_text(categories->'ids')
时它太慢了。为什么会这样?
SELECT p.id, p.name, p.categories
FROM product p
INNER JOIN (SELECT id, jsonb_array_elements_text(categories->'ids') categoryid FROM product) pc ON p.id = pc.id
INNER JOIN category c ON pc.categoryid = c.categoryid AND c.rootid = 1000;
在 PostgreSQL 中,JSON
和 JSONB
类型有额外的索引类型 GIN
。为获得最佳性能,您必须为此 JSON 字段创建索引。
例如:
CREATE INDEX product_category_json_index ON product USING gin (categories jsonb_path_ops);
我为您写了一个替代查询:
select main.*, cat.* from
(
select p.*, jsonb_array_elements((categories->'ids'))::integer as category_id
from product p
) main
inner join examples.category cat on cat.id = main.category_id;
我想获得更详细的信息,对于这些表,如果你知道那么请告诉我这两个表中有多少条记录(product
和category
)
我想将示例数据(相同计数)插入到我的本地表中以进行测试和分析