dbfiddle.uk/...

я есть следующая схема + данные:

create table org_users (
  id character varying (255),
  settings_id character varying (255) -- fk: settings.id
);

create table settings (
  id character varying (255), -- primary key settings_id
  perdiem_settings character varying (255), -- jsonised fk to perdiems.id
  floor_settings character varying (255) -- jsonised fk to floors.id
);

create table perdiems (
  id integer, -- primary key
  name character varying(255)
);

create table floors (
  id integer, -- primary key
  name character varying (255)
);

insert into perdiems (id, name) values (1, 'perdiem 1');
insert into perdiems (id, name) values (2, 'perdiem 2');
insert into perdiems (id, name) values (3, 'perdiem 3');

insert into floors (id, name) values (1, 'floor 1');
insert into floors (id, name) values (2, 'floor 2');
insert into floors (id, name) values (3, 'floor 3');

insert into settings (id, perdiem_settings, floor_settings) values ('setting1', '{"allowed_per_diem_ids":[1, 2]}', '{"allowed_floor_ids":[1]}');
insert into settings (id, perdiem_settings, floor_settings) values ('setting2', '{"allowed_per_diem_ids":[2, 3]}', '{"allowed_floor_ids":[1, 2]}');
insert into settings (id, perdiem_settings, floor_settings) values ('setting3', '{"allowed_per_diem_ids":[3, 1]}', '{"allowed_floor_ids":[1, 2, 3]}');

insert into org_users (id, settings_id) values ('user1', 'setting1');
insert into org_users (id, settings_id) values ('user2', 'setting2');
insert into org_users (id, settings_id) values ('user3', 'setting3');

Теперь я хочу создать представление, которое будет иметь агрегаты из каждой другой таблицы в собственное поле массива. Чтобы объяснить на примере, вид, который я хочу, должен выглядеть так:

org_user_id | settings_id | perdiems                   | floors
--------------------------------------------------------------------------------------------
user1       | setting1    | ['perdiem 1', 'perdiem 2'] | ['floor 1']
user2       | setting2    | ['perdiem 2', 'perdiem 3'] | ['floor 1', 'floor 2']
user3       | setting3    | ['perdiem 3', 'perdiem 1'] | ['floor 1', 'floor 2', 'floor 3']

Этот вопрос несколько связан сагрегатные соединения postgres соответствуют полю массива который имеет дело с созданием полей массива из совпадений соединения. Однако здесь я хочу создать несколько полей массива в одном представлении и, таким образом, используяGROUP BY пункт не будет осуществимым iiuc.

Запрос, который я пробовал:

CREATE OR REPLACE VIEW users_settings_view AS
 SELECT ou.id AS org_user_id, <other fields...>
    FROM org_users ou
     LEFT JOIN settings pdr_s ON pdr_s.id = ou.settings_id
     LEFT JOIN perdiems pdr ON pdr.id = ANY (SELECT json_array_elements(perdiem_settings::JSON->'allowed_per_diem_ids')::text::int FROM settings)

который создает повторяющиеся записи для каждого соответствующего perdiem из-за объединения, а не создания массива. Даже если я напишу массив, как упомянуто в другом вопросе stackoverflow, он не будет работать, если у меня будет несколько строковых массивов как часть представления для разных столбцов. В любом случае, я могу получить несколько совпадений для нескольких полей массива в одном представлении?

Ответы на вопрос(1)

Ваш ответ на вопрос