Вот код, который поможет вам понять мой вопрос:
create table con ( content_id number);
create table mat ( material_id number, content_id number, resolution number, file_location varchar2(50), file_size number);
create table con_groups (content_group_id number, content_id number);
insert into con values (99);
insert into mat values (1, 99, 7, 'C:\foo.jpg', 1024);
insert into mat values (2, 99, 2, '\\server\xyz.mov', 350000);
insert into mat values (3, 99, 5, '\\server2\xyz.wav', 175000);
insert into con values (100);
insert into mat values (4, 100, 5, 'C:\bar.png', 2048);
insert into mat values (5, 100, 3, '\\server\xyz.mov', 27400);
insert into mat values (6, 100, 7, '\\server2\xyz.wav', 400);
insert into con_groups values (10, 99);
insert into con_groups values (10, 100);
SELECT m.material_id,
m.content_id,
(SELECT max(file_location) keep (dense_rank first order by resolution desc)
FROM mat
WHERE mat.content_id = m.content_id
/* AND ...
AND ...
AND ... */) special_mat_file_location,
(SELECT max(file_size) keep (dense_rank first order by resolution desc)
FROM mat
WHERE mat.content_id = m.content_id
/* AND ...
AND ...
AND ... */) special_mat_file_size
FROM mat m
WHERE m.material_id IN (select material_id
from mat
inner join con on con.content_id = mat.content_id
inner join con_groups on con_groups.content_id = con.content_id
where con_groups.content_group_id = 10);
Я поместил закомментированные AND, чтобы подчеркнуть, что это упрощенный пример; подзапрос в моем реальном запросе является более сложным с большим количеством критериев.
Моя проблема: я хочу избежать повторения всех критериев в подзапросе для обоих столбцов (file_location and file_size
), потому что критерии абсолютно одинаковы. Я бы с удовольствием использовал Common Table Expressions (то есть факторинг подзапроса с использованием предложения WITH), но не могу из-за «WHERE mat.content_id = m.content_id
» в подзапросе, что делает его коррелированным подзапросом. Насколько я понимаю, нельзя учитывать коррелированные подзапросы, используя предложение WITH. По этой же причине я также не могу поместить этот подзапрос в виде встроенного представления (или производной таблицы) в предложении FROM.
Как я могу включить критерии один раз и добавить более одного столбца в набор результатов с коррелированным подзапросом?