我有一个查询,该查询可一次插入两个表(由于链接的外键约束而需要),并且想返回同一级别的两次插入的结果,但是我不确定该怎么做,或者如果可能的话。
插入物看起来像这样,并且工作正常:
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/>', 'stack@overflow.com')
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
);
添加组织ID外键:
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);
答案 0 :(得分:1)
您可以这样表达:
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
答案 1 :(得分:0)
解决了缺少列名的问题:
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