Объединение расширенного JSONB со столбцами из родительской таблицы и поиск связанных таблиц - PullRequest
0 голосов
/ 18 октября 2019

Я пытаюсь создать запрос для встраивания в представление, которое начинается с таблицы с обычными столбцами и столбцом 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
...