당신이 내 질문을 이해하는 데 도움이 코드입니다 :긴 CORRELATED 하위 쿼리를 반복하지 않으려면 어떻게해야합니까?
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
)에 대한 하위 쿼리의 모든 조건을 반복하지 않으려는 기준이 동일합니다. 기꺼이 공통 테이블 표현식 (WITH 절을 사용하여 하위 쿼리를 분해)을 사용 하겠지만 하위 쿼리에서 "WHERE mat.content_id = m.content_id
"을 사용할 수 없으므로 상관 관계가있는 하위 쿼리가됩니다. WITH 절을 사용하여 상관 관계가있는 하위 쿼리를 고려할 수 없다는 것이 내 이해입니다. 같은 이유로 FROM 절에이 하위 쿼리를 인라인 뷰 (파생 테이블이라고도 함)로 넣을 수도 없습니다.
기준을 한 번 포함시키고 상관 집합 하위 쿼리를 사용하여 결과 집합에 둘 이상의 열을 주입하려면 어떻게합니까?
걱정되는 텍스트 크기 또는 쿼리 성능을 쿼리하는 것입니까? – jva
좋은 질문입니다. 하위 쿼리 변경 기준 (실제 가능성)이 있어야이 쿼리를 나중에 유지 관리하는 것이 걱정됩니다. 그래서 쿼리 텍스트 크기가 걱정됩니다. –