2017-02-17 64 views
2

我有以下模式:选择自己的数组。 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和失败“出现了新的困难”和“参数不匹配”。

正确

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

错误

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

因此,请求应该找哪里都要求运行失败和错误属于特定运行:

1运行不适合我因为它没有'参数不匹配'并且没有错误ERROR2 TYPE。 2运行适合我,因为它具有所有错误(ERROR2 TYPE)并且全部失败('显示新的难度'和'参数不匹配')。 3运行适合我,因为它具有所有错误(ERROR2 TYPE)并且全部失败('显示新的难度'和'参数不匹配')。如果运行失败(它有新的失败:'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' 

此代码soens;吨工作过,只能搜索1的比赛,但不是一整套(“出现了新的困难','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 

似乎我需要某种交集。

回答

0

我已与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 

主题可以关闭。

0

这是我的理解:

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"}