2017-02-17 4 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 run подходит мне, так как он имеет все ошибки (ERROR2 TYPE), и все не удается («Появилась новая трудность» и «Несоответствие параметров»). Пробег 3 соответствует мне, так как он имеет все ошибки (ERROR2 TYPE), и все сбой («Появилась новая трудность» и «Несоответствие параметров»). Это нормально, если в прогоне больше сбоев (у него есть новый сбой: «Несоответствие вложений»), чем мы просили, но он должен иметь, по крайней мере, запрос об ошибках и ошибках.

Как я могу это сделать?

Следующая 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, т работать тоже, поиск только один матч, но не весь набор ('Появилась новая трудность ',' Несоответствие параметров '):

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"} 
Смежные вопросы