2017-07-10 7 views
0

Supposons que nous ayons ces quatre tableaux:Comment éviter les sous-requêtes de corrélation à l'intérieur de CASE WHEN?

create table table_x(x number, title varchar2(100)); 

create table table_y(y number, x number, title varchar2(100)); 

create table table_z(z number, y number, x number, title varchar2(100)); 

create table table_main(z number, y number, x number); 

Il est obligatoire de chercher title pour chaque ligne table_main selon la règle:

select 
    case 
     when z is not null 
     then (select title from table_z where x = tm.x and y = tm.y and z = tm.z) 

     when y is not null 
     then (select title from table_y where x = tm.x and y = tm.y) 

     when x is not null 
     then (select title from table_x where x = tm.x) 
    end as title 
from table_main tm; 

Je suis à la recherche d'une solution plus facile à lire des résultats équivalents.

Existe-t-il un moyen de refactoriser la requête en remplaçant l'instruction case when par des jointures de table ou d'une autre manière?

+1

Ce sont les sous-requêtes scalaires. Vous pouvez les éviter en utilisant trois jointures à gauche plus une coalesce() – joop

+0

@joop semble avoir eu la même idée ;-) –

Répondre

2

mon approche serait:

SELECT COALESCE(tz.title, ty.title, tx.title) AS mytitle 
    FROM table_main tm 
    LEFT OUTER JOIN table_x tx 
    ON tx.x_number = tm.x_number 
    LEFT OUTER JOIN table_y ty 
    ON ty.x_number = tm.x_number 
    AND ty.y_number = tm.y_number 
    LEFT OUTER JOIN table_z tz 
    ON tz.x_number = tm.x_number 
    AND tz.y_number = tm.y_number 
    AND tz.z_number = tm.z_number