У меня есть следующая схема:Выберите с помощью собственного массива. 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
Кажется, мне нужно какое-то пересечение.