Voici le code pour vous aider à comprendre ma question:Comment éviter de répéter une sous-requête 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);
je mets les ANDs commentaires pour mettre en évidence que c'est un exemple simplifié; la sous-requête dans ma requête réelle est plus complexe avec plus de critères.
Mon problème est: Je veux éviter de répéter tous les critères de la sous-requête pour les deux colonnes (file_location and file_size
) car le critère est exactement le même. J'utiliserais avec plaisir les expressions de table communes (c'est-à-dire la factorisation de sous-requête en utilisant la clause WITH) mais je ne peux pas en raison du "WHERE mat.content_id = m.content_id
" dans la sous-requête, ce qui en fait une sous-requête corrélée. Je crois comprendre qu'on ne peut pas factoriser les sous-requêtes corrélées en utilisant la clause WITH. Pour la même raison, je ne peux pas non plus mettre cette sous-requête en tant que vue en ligne (ou table dérivée) dans la clause FROM.
Comment puis-je inclure les critères une fois et injecter plus d'une colonne dans le jeu de résultats avec une sous-requête corrélée?
S'agit-il simplement de taille de texte de requête ou de performances de requête qui vous inquiètent? – jva
C'est une bonne question. Je suis inquiet de maintenir cette requête plus tard, si les critères de la sous-requête changent (ce qui est une réelle possibilité). Donc, oui, je m'inquiète de la taille du texte de la requête. –