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