Я пытаюсь создать запрос для встраивания в представление, которое начинается с таблицы с обычными столбцами и столбцом JSONB:
DROP TABLE IF EXISTS data.domo_passthrough CASCADE;
CREATE TABLE IF NOT EXISTS data.domo_passthrough (
id uuid NOT NULL DEFAULT extensions.gen_random_uuid (),
type_name text NOT NULL DEFAULT NULL,
report_data jsonb NOT NULL DEFAULT '{}',
hsys_id uuid NOT NULL DEFAULT '00000000000000000000000000000000',
facility_id uuid NOT NULL DEFAULT '00000000000000000000000000000000',
CONSTRAINT domo_passthrough_id_pkey
PRIMARY KEY (id)
);
JSON в моем тестовом примере выглядит следующим образом:
[
{"table_name":"Activity","record_count":0,"table_number":214},
{"table_name":"Assembly","record_count":1,"table_number":15},
{"table_name":"AssemblyProds","record_count":0,"table_number":154}
]
Для расширения я могу использовать CREATE TYPE
или добавить информацию о типе в строку, например, так:
select expanded_data.*
from domo_passthrough,
jsonb_to_recordset(report_data) as expanded_data (
table_name text,
record_count integer,
table_number integer
)
Это отлично работает, JSONB правильно расширен додайте мне три столбца:
table_name record_count table_number
Но теперь я хочу добавить обратно в некоторые столбцы из родительской таблицы с помощью поиска по связанным таблицам. Вот простой запрос без расширения JSONB:
select domo_passthrough.id as report_data_id,
coalesce(hsys.name_,'') as hsys_name,
coalesce(facility.name_,'') as facility_name
from domo_passthrough
left join facility on (domo_passthrough.facility_id = facility.id)
left join hsys on (domo_passthrough.hsys_id = hsys.id)
Это прекрасно работает, чтобы дать мне три столбца:
report_data_id hsys_name facility_name
То, что я не знаю, как правильно соединить все водин раз. А именно, набор строк, подобный этому:
report_data_id hsys_name facility_name table_name record_count table_number
Я разбирался с тем, чтобы поместить два запроса в CTE, попробовать CROSS JOIN
и использовать синтаксис. Суть проблемы в том, что я не понимаю, как мне присоединиться. Если у меня есть 10 строк в родительской таблице domo_passthrough
, и у каждого из них есть 5 элементов в их JSONB domo_passthrough.report_data, я пытаюсь получить 50 строк с 6 столбцами в каждой. Очевидно, что значения report_data_id
, hsys_name
и facility_name
повторяются для каждого из расширенных значений JSONB, содержащихся в исходной строке, если я сделаю это правильно. Я был бы благодарен за исправительную помощь в таком виде соединения. Буду очень благодарен за комментарий. Это разумный путь, или есть более разумный подход?
Это разумное решение?
Я нашел решение, но не могу сказать, что я действительно понимаю, каконо работает.
select domo_passthrough.id as report_data_id,
coalesce(hsys.name_,'') as hsys_name,
coalesce(facility.name_,'') as facility_name,
expanded_data.table_name,
expanded_data.record_count,
expanded_data.table_number
from domo_passthrough
left join facility on (domo_passthrough.facility_id = facility.id)
left join hsys on (domo_passthrough.hsys_id = hsys.id)
cross join jsonb_populate_recordset(null::table_stats_type, domo_passthrough.report_data) as expanded_data