У меня есть база данных PostgreSQL 11 с этими таблицами:
CREATE TABLE stats (
id integer NOT NULL,
uid integer NOT NULL,
date date NOT NULL,
data jsonb DEFAULT '[]'::json NOT NULL
);
INSERT INTO stats(id, uid, date, data) VALUES
(1, 1, '2020-10-01', '{"somerandomhash":{"source":"thesource"}}');
CREATE TABLE links(
id integer NOT NULL,
uuid uuid NOT NULL,
path text NOT NULL
);
INSERT INTO links(id, uuid, path) VALUES
(1, 'acbd18db-4cc2-f85c-edef-654fccc4a4d8', 'thesource');
Моя цель - создать новую таблицу reports
с data
из таблицы stats
, но с новой ключ из таблицы links
. Это будет выглядеть так:
CREATE TABLE reports(
id integer NOT NULL,
uid integer NOT NULL,
date date NOT NULL,
data jsonb DEFAULT '[]'::json NOT NULL
);
INSERT INTO reports(id, uid, date, data) VALUES
(1, 1, 2020-10-01, {"uuid":{"source":"thesource"});
Для этого я попытался присоединиться к таблице links
слева, чтобы получить значение столбца uuid
- без везения:
SELECT s.uid, s.date, s.data->jsonb_object_keys(data)->>'source' as path, s.data->jsonb_object_keys(data) as data, l.uuid
FROM stats s LEFT JOIN links l ON s.data->jsonb_object_keys(data)->>'source' = l.path
Я пытался использовать результат s.data-> jsonb_object_keys (data) - >> 'source' в левом соединении, но получил ошибку:
ERROR: set-returning functions are not allowed in JOIN conditions
I попытался использовать LATERAL
, но результат все еще не действителен.
Как заставить это работать?