Select 有自己的数组。 PostgreSQL 9.5

Select with own array. PostgreSQL 9.5

我有以下架构:

create table reports (id bigserial primary key);
create table scens (id bigserial primary key,report_id bigint references reports(id), path_id bigint);
create table runs (id bigserial primary key,scen_id bigint references scens(id));
create table fails (
    id bigserial primary key,
    run_id bigint references runs(id),
    type varchar not null
);

create table errors (
    id bigserial primary key,
    run_id bigint references runs(id),
    type varchar not null
);
INSERT INTO reports(id)
    VALUES (1);
INSERT INTO reports(id)
    VALUES (2);

INSERT INTO scens(id, report_id)
    VALUES (555, 1);
INSERT INTO scens(id, report_id)
    VALUES (666, 2);

INSERT INTO runs(id, scen_id)
    VALUES (1, 555);
INSERT INTO runs(id, scen_id)
    VALUES (2, 666);
INSERT INTO runs(id, scen_id)
    VALUES (3, 666);
INSERT INTO runs(id, scen_id)
    VALUES (4, 666);

INSERT INTO errors(id, run_id, type)
    VALUES (DEFAULT, 2, 'ERROR2 TYPE');
INSERT INTO errors(id, run_id, type)
    VALUES (DEFAULT, 3, 'ERROR2 TYPE');

INSERT INTO fails(id, run_id, type)
    VALUES (DEFAULT, 1, 'Attachment Journal Mismatch');
INSERT INTO fails(id, run_id, type)
    VALUES (DEFAULT, 2, 'Appeared new difficulty');
INSERT INTO fails(id, run_id, type)
    VALUES (DEFAULT, 2, 'Parameters Mismatch');
INSERT INTO fails(id, run_id, type)
    VALUES (DEFAULT, 3, 'Attachment Journal Mismatch');
INSERT INTO fails(id, run_id, type)
    VALUES (DEFAULT, 3, 'Appeared new difficulty');
INSERT INTO fails(id, run_id, type)
    VALUES (DEFAULT, 3, 'Parameters Mismatch');

我需要找到一个 运行(实际上更多 运行),它有错误 ERROR2 TYPE 和 FAILS 'Appeared new difficulty' 和 'Parameters Mismatch'。

正确

1 -> 'ERROR2 TYPE'
1 -> 'Appeared new difficulty'
1 -> 'Parameters Mismatch'

不正确

2 -> 'Parameters Mismatch'
2 -> 'Appeared new difficulty'

因此,请求应该找到请求失败且错误属于特定 运行 的所有 运行:

1 运行 不适合我,因为它没有 'Parameters Mismatch' 并且没有错误 ERROR2 TYPE。 2 运行 适合我,因为它有所有错误(ERROR2 类型)并且全部失败('Appeared new difficulty' 和 'Parameters Mismatch')。 3 运行 适合我,因为它有所有错误(ERROR2 类型)并且全部失败('Appeared new difficulty' 和 'Parameters Mismatch')。如果 运行 的失败次数(它有新的失败次数:'Attachment Journal Mismatch')比我们请求的多,那没关系,但它必须至少有请求的失败和错误。

我该怎么做?

以下 sql 根本不起作用(它什么也没找到):

select scens.id as scen_id,
scens.path_id, fails.type, reports.id, runs.id
from reports
inner join scens on reports.id=scens.report_id
inner join runs on runs.scen_id=scens.id
inner join fails on fails.runs_id=runs.id
where reports.id=2 and fails.type=''Parameters Mismatch' 
and fails.type='Appeared new difficulty'

此代码也无法正常工作,它只搜索 1 个匹配项,而不搜索整组 ('Appeared new difficulty', 'Parameters Mismatch'):

select scens.custom_id as scen_custom_id, scens.id as scen_id,
    scens.path_id, scens.category, fails_map.type, f.error_type
    from reports
    inner join scens on reports.id=scens.report_id
    inner join runs on runs.scen_id=scens.id
    inner join fails on fails.runs_id=runs.id
    INNER JOIN 
    unnest(array['Appeared new difficulty', 'Parameters Mismatch']) f (error_type) 
    on fails.type=f.error_type
    where reports.id=2

看来我需要某种交集。

这是我的理解:

select
    reports.id as report,
    scens.id as scen,
    scens.path_id as path,
    runs.id as run,
    array_agg(distinct fails.type) as fails,
    array_agg(distinct errors.type) as errors
from
    reports
    inner join
    scens on reports.id = scens.report_id
    inner join
    runs on runs.scen_id = scens.id
    left join
    fails on fails.run_id = runs.id
    left join
    errors on errors.run_id = runs.id
where reports.id = 2
group by 1,2,3,4
having
    array['Parameters Mismatch','Appeared new difficulty']::varchar[] <@ array_agg(fails.type) and
    array['ERROR2 TYPE']::varchar[] <@ array_agg(errors.type)
;
 report | scen | path | run |                                      fails                                      |     errors      
--------+------+------+-----+---------------------------------------------------------------------------------+-----------------
      2 |  666 |      |   2 | {"Appeared new difficulty","Parameters Mismatch"}                               | {"ERROR2 TYPE"}
      2 |  666 |      |   3 | {"Appeared new difficulty","Attachment Journal Mismatch","Parameters Mismatch"} | {"ERROR2 TYPE"}

我已经用 sql 解决了它:

select runs.id
    from reports
    inner join scens s on reports.id=s.report_id
    inner join runs on runs.scen_id=s.id
    where exists(select * from fails where fails.path_id=s.path_id and fails.type='Rotation Mismatch')
    and exists(select * from fails where fails.path_id=s.path_id and fails.type='Disappeared inspection')
    and reports.id=2

主题可以关闭