Jointures externes… L’ancien et le nouveau monde !

Avant que la norme de 1992 (c’est vieux… certains lecteurs n’étais même pas nés…) ne statue sur la jointure externe, certains éditeurs avaient commencé à faire des jointures externes à leur mode… il en est ainsi de SQL Server.

Le petit exemple qui suit vous montre toute l’horreur que l’on obtient entre les deux mondes :


CREATE DATABASE DB_JOINS
GO
 
USE DB_JOINS
GO
 
EXEC sp_dbcmptlevel 'DB_JOINS', 80
GO
 
CREATE TABLE T1 (C INT)
 
INSERT INTO T1 VALUES (1)
INSERT INTO T1 VALUES (2)
INSERT INTO T1 VALUES (3)
 
CREATE TABLE T2 (C INT)
 
INSERT INTO T2 VALUES (0)
INSERT INTO T2 VALUES (2)
INSERT INTO T2 VALUES (3)
 
CREATE TABLE T3 (C INT)
 
INSERT INTO T3 VALUES (2)
INSERT INTO T3 VALUES (3)
INSERT INTO T3 VALUES (4)

Et voici maintenant les deux versions d’une même requête avec des jointures externes…
Voici la préhistorique, absolument obsolète :


SELECT *
FROM   T1, T2, T3
WHERE  T1.C *= T2.C  
  AND  T2.C =* T3.C

qui donne :


C           C           C
----------- ----------- -----------
1           NULL        2
1           NULL        3
1           NULL        4
2           2           2
2           NULL        3
2           NULL        4
3           NULL        2
3           3           3
3           NULL        4

Et la moderne, la seule, la vraie :


SELECT *
FROM   T1
       LEFT OUTER JOIN T2
            ON T1.C = T2.C  
       RIGHT OUTER JOIN T3
            ON T2.C = T3.C

Qui restitue une information bien plus censée :


C           C           C
----------- ----------- -----------
2           2           2
3           3           3
NULL        NULL        4

Si vous ne voyez pas la différence… faites moi signe, je vous offre une paire de lunette !

***
Fr̩d̩ric BROUARD РSQLpro РMVP SQL Server
Spécialiste SQL/BD modélisation de données
SQL & SGBDR http://sqlpro.developpez.com/
Expert SQL Server : http://www.sqlspot.com
audits – optimisation – tuning – formation

Laisser un commentaire