Comment faire une jointure conditionnelle ? Par exemple une jointure qui prend en compte une table X ou bien une table Y dans une requête ?
Beaucoup plus simples qu’il n’y parait avec des jointures externes.
Le principe est le suivant :
Chacune des tables conditionnelle est jointe à la table maître en jointure externe. Dans le prédicat de jointure on ajoute un paramètre qui doit être vrai pour la seule table considérée. Dans la clause SELECT, toutes les colonnes de l’une ou l’autre table doivent être « coalescées ». Dans le filtre WHERE on ne prend en compte que les lignes pour lesquelles les colonnes « coalescées » ne sont pas NULL…
Démonstration
CREATE TABLE T2 (C INT)
CREATE TABLE T3 (C INT)
INSERT INTO T1 VALUES (1)
INSERT INTO T1 VALUES (2)
INSERT INTO T1 VALUES (3)
INSERT INTO T2 VALUES (2)
INSERT INTO T3 VALUES (3)
Jointure conditionnelle avec table 2 :
DECLARE @CONDITION INT
SET @CONDITION = 2
SELECT T1.*, COALESCE(T2.C, T3.C)
FROM T1
LEFT OUTER JOIN T2 ON T1.C = T2.C AND @CONDITION = 2
LEFT OUTER JOIN T3 ON T1.C = T3.C AND @CONDITION = 3
WHERE COALESCE(T2.C, T3.C) IS NOT NULL
Exemple de résultat :
C
----------- -----------
2 2
—
Frédéric BROUARD, Spécialiste modélisation, bases de données, optimisation, langage SQL.
Le site sur le langage SQL et les S.G.B.D. relationnels : http://sqlpro.developpez.com/
Expert SQL Server http://www.sqlspot.com : audit, optimisation, tuning, formation
* * * * * Enseignant au CNAM PACA et à l’ISEN à Toulon * * * * *