Возврат из двух таблиц в одном запросе

У меня есть запрос, который вставляет сразу две таблицы (требуется из-за связывающих их ограничений внешнего ключа) и хотел бы вернуть результат обеих вставок на одном уровне, но я не уверен, как это будет сделано, или если это даже возможно.

Вставки выглядят так и работают нормально:

with org_b as (
    insert into public.base (
        id,
        organisation_id,
        last_modified_by
    )
    values ('<organisation UUID/>', '<organisation UUID/>', '<user UUID/>')
    returning *
), org_eb as (
    insert into public.entity_base (
        id
    )
    values ('<organisation UUID/>')
    returning *
), org as (
    insert into public.organisation_data (
        id, 
        armicus_name
    )
    values ('<organisation UUID/>', 'Stack Overflow')
    returning *
), use_b as (
    insert into public.base (
        id,
        organisation_id,
        last_modified_by
    )
    values ('<user UUID/>', '<organisation UUID/>', '<user UUID/>')
    returning *
), use_eb as (
    insert into public.entity_base (
        id
    )
    values ('<user UUID/>')
    returning *
), use as (
    insert into public.user_account_data (
        id,
        email
    )
    values ('<user UUID/>', '[email protected]')
    returning *
)

Я хотел бы вернуть его примерно так:

select to_json(
    select org_b.id, org_b.organisation_id, org_b.created_date, org_b.last_modified_date, org_b.last_modified_by, org_b.armicus_data, org.armicus_name
    from org_b
    join org on org_b.id = org.id
) as organisation, to_json(
    select use_b.id, use_b.organisation_id, use_b.created_date, use_b.last_modified_date, use_b.last_modified_by, use_b.armicus_data, use.email
    from use_b
    join use on use_b.id = use.id
) as user
from org_b  

Но это вызывает синтаксическую ошибку, есть ли способ добиться этого? Я также могу загрузить SQL для создания таблиц, если это поможет.

Отредактировано для добавления SQL для создания таблиц и ограничений:

Создайте базовую таблицу:

CREATE TABLE base (
    id uuid PRIMARY KEY,
    organisation_id uuid NOT NULL,
    created_date timestamptz NOT NULL DEFAULT now(),
    last_modified_date timestamptz NOT NUll,
    last_modified_by uuid NOT NULL,
    armicus_data jsonb
);

Создать базу сущностей:

CREATE TABLE entity_base (
    id uuid PRIMARY KEY REFERENCES base(id) ON DELETE CASCADE,
    template_id uuid
);

Создать данные организации:

CREATE TABLE organisation_data (
    id uuid PRIMARY KEY REFERENCES entity_base(id) ON DELETE CASCADE,
    armicus_name TEXT
);

Создайте данные учетной записи пользователя:

CREATE TABLE user_account_data (
    id uuid PRIMARY KEY REFERENCES entity_base(id) ON DELETE CASCADE,
    email text NOT NULL
);

Добавьте внешний ключ идентификатора организации:

ALTER TABLE base ADD CONSTRAINT base_organisation_id_fkey FOREIGN KEY (organisation_id) REFERENCES organisation_data(id);

Добавить последнее изменение по внешнему ключу:

ALTER TABLE base ADD CONSTRAINT base_last_modified_by_fkey FOREIGN KEY (last_modified_by) REFERENCES user_account_data(id);

Хм, не уверен, что это так, но попробуйте заключить подзапросы в круглые скобки (в дополнение к скобкам, заключающим аргументы для to_json()). В противном случае да, инструкции CREATE помогут, а также полное сообщение об ошибке, которое вы получите.

sticky bit 27.05.2019 12:22
select ... from (a join b on ...)
Psi 27.05.2019 12:37

В вашем заявлении о проблеме упоминаются две вставки, но в коде их шесть. Я запутался.

Gordon Linoff 27.05.2019 12:47

@stickybit сообщение об ошибке для sql, которое я только что попытался сказать, синтаксическая ошибка при выборе внутри первого to_json

Exitialis 27.05.2019 13:09

Пожалуйста, в вопросах по коду укажите минимальный воспроизводимый пример - вырезать, вставить и выполнить код; пример ввода с желаемым и фактическим выводом (включая дословные сообщения об ошибках); четкая спецификация и объяснение. Это включает в себя наименьший код, который вы можете дать, то есть код, который, как вы показываете, в порядке, расширенный кодом, который вы показываете, не в порядке. (Основы отладки.) PS Ваша проблема заключается в том, что расширение кода не возвращает то, что вы ожидаете. Подождите, пока это не будет решено, чтобы спросить о вашей общей цели.

philipxy 28.05.2019 00:28
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
5
40
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете сформулировать это как:

select to_json( (select b.id, b.organisation_id, b.created_date, b.last_modified_date, b.last_modified_by, b.armicus_data, org.armicus_name
                 from org_b b join
                      org o
                      on b.id = o.id
                )
              ) as organisation,
       to_json( (select b.id, b.organisation_id, b.created_date, b.last_modified_date, b.last_modified_by, b.armicus_data, u.email
                 from use_b b join
                      use u
                      on b.id = u.id
                )
              ) as user
from org_b ;

Или я бы, вероятно, написал это, перемещая преобразование json в подзапрос:

select (select to_json( (b.id, b.organisation_id, b.created_date, b.last_modified_date, b.last_modified_by, b.armicus_data, org.armicus_name) )
        from org_b b join
             org o
             on b.id = o.id
       ) as organisation,
      (select to_json( (b.id, b.organisation_id, b.created_date, b.last_modified_date, b.last_modified_by, b.armicus_data, u.email) )
       from use_b b join
            use u
            on b.id = u.id
      ) ) as user
from org_b 

Первый выдает синтаксическую ошибку в as в конце первого to_json (как организация). Второй работает, но все ключи JSON - от f1 до f7 вместо имен столбцов, есть ли способ указать ему, как вызывать свойства?

Exitialis 27.05.2019 13:06
Ответ принят как подходящий

Решил проблему отсутствия имен столбцов следующим образом:

SELECT (
    SELECT to_json(o)
    FROM (
        SELECT org_b.id, org_b.organisation_id, org_b.created_date, org_b.last_modified_date, org_b.last_modified_by, org_b.armicus_data, org.armicus_name
        FROM org_b
        JOIN org on org_b.id = org.id
    ) o
) AS organisation, (
    SELECT to_json(u)
    FROM (
        SELECT use_b.id, use_b.organisation_id, use_b.created_date, use_b.last_modified_date, use_b.last_modified_by, use_b.armicus_data, use.email
        FROM use_b
        JOIN use on use_b.id = use.id
    ) u     
) AS user
FROM org_b

Другие вопросы по теме