2 votes

Requête SQL avec filtre commun pour plusieurs colonnes

Le filtre dans la requête suivante est identique.

select * from t_profile where 
profile_id in        (select profile_id from t_profile ...) or 
active_profile_id in (select profile_id from t_profile ...);

Pouvons-nous éviter de répéter le filtre ?

2voto

a_horse_with_no_name Points 100769

Vous pouvez utiliser un expression de table commune pour ça :

with filter as (
   select profile_id 
   from ...
   where ...
)
select *
from t_profile
where profile_id in (select profile_id from filter)
   or active_profile_id in (select profile_id from filter);

0voto

GeorgiG Points 399

Vous pouvez vous joindre à nous :

SELECT * FROM T_profile1 AS t1
JOIN T_Profile2 AS t2
ON t1.profile_id = t2.profile_id 
 OR t1.active_Profile_id = t2.profile_id

Si vous ne voulez pas de colonnes répétées, vous pouvez faire des requêtes séparées et les UNIONNER

SELECT * FROM T_profile1 AS t1
JOIN T_Profile2 AS t2
ON t1.profile_id = t2.profile_id

UNION

SELECT * FROM T_profile1 AS t1
JOIN T_Profile2 AS t2
ON t1.active_Profile_id = t2.profile_id

Je vous recommande de lire https://www.w3schools.com/sql/default.asp pour plus de principes fondamentaux de SQL

0voto

Gordon Linoff Points 213350

Vous pouvez éviter de répéter le filtre en utilisant exists plutôt que in :

select p.*
from t_profile p
where exists (select 1
              from t_profile p2 . . .
              where p2.profile_id = p.profile_id or
                    p2.profile_id = active_profile_id
             );

Cela dit, répéter le filtre en utilisant soit in o exists est probablement la meilleure option.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X