Salut tout le monde.

Oui un post de plus sur les jointures mais là je sèche et mes recherches n'apportent rien.

J'essaie de faire une requête sur une table avec une jointure sur elle même, mais avec une jointure à gauche ça ne me retourne rien.

D'abord la table avec ses données :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
create table TEST
(NUM VARCHAR2(4 BYTE),
MOIS NUMBER(2),
DAT DATE)
 
insert into test values('9999', 1, TO_DATE ('31/01/1998', 'DD/MM/YYYY'))
insert into test values('9999', 2, TO_DATE ('28/02/1998', 'DD/MM/YYYY'))
insert into test values('9999', 3, TO_DATE ('31/03/1998', 'DD/MM/YYYY'))insert into test values('9999', 4, TO_DATE ('30/04/1998', 'DD/MM/YYYY'))
Et ensuite mes requête avec les résultats :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
SELECT *
  FROM TEST t1
 WHERE t1.dat <= TO_DATE ('31/03/1998', 'DD/MM/YYYY')
--Row#	NUM	MOIS	DAT
--1	9999	1	31/01/1998
--2	9999	2	28/02/1998
--3	9999	3	31/03/1998
 
SELECT *
  FROM TEST t1 LEFT OUTER JOIN TEST t2 ON t1.mois = t2.mois
                                          AND t1.num = t2.num
 WHERE t1.dat <= TO_DATE ('31/03/1998', 'DD/MM/YYYY')
   AND t2.dat <= TO_DATE ('31/03/1997', 'DD/MM/YYYY')
--Row#	NUM	MOIS	DAT	NUM_1	MOIS_1	DAT_1
--1	NULL	NULL	NULL	NULL	NULL	NULL
 
SELECT *
  FROM TEST t1, TEST t2
 WHERE t1.mois(+) = t2.mois
   AND t1.num(+) = t2.num
   AND t1.dat <= TO_DATE ('31/03/1998', 'DD/MM/YYYY')
   AND t2.dat <= TO_DATE ('31/03/1997', 'DD/MM/YYYY')
--Row#	NUM	MOIS	DAT	NUM_1	MOIS_1	DAT_1
--1	NULL	NULL	NULL	NULL	NULL	NULL
Pourtant les jointures fonctionnent correctement sans les conditions :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
SELECT *
  FROM TEST t1 LEFT OUTER JOIN TEST t2 ON t1.mois = t2.mois
                                          AND t1.num = t2.num
 WHERE t1.dat <= TO_DATE ('31/03/1998', 'DD/MM/YYYY')
--Row#	NUM	MOIS	DAT	NUM_1	MOIS_1	DAT_1
--1	9999	1	31/01/1998	9999	1	31/01/1998
--2	9999	2	28/02/1998	9999	2	28/02/1998
--3	9999	3	31/03/1998	9999	3	31/03/1998
 
SELECT *
  FROM TEST t1, TEST t2
 WHERE t1.mois(+) = t2.mois
   AND t1.num(+) = t2.num
   AND t1.dat <= TO_DATE ('31/03/1998', 'DD/MM/YYYY')
--Row#	NUM	MOIS	DAT	NUM_1	MOIS_1	DAT_1
--1	9999	1	31/01/1998	9999	1	31/01/1998
--2	9999	2	28/02/1998	9999	2	28/02/1998
--3	9999	3	31/03/1998	9999	3	31/03/1998
J'espérais avoir comme résultat avec la jointure à gauche :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
--Row#	NUM	MOIS	DAT	NUM_1	MOIS_1	DAT_1
--1	9999	1	31/01/1998	NULL	NULL	NULL	
--2	9999	2	28/02/1998	NULL	NULL	NULL	
--3	9999	3	31/03/1998	NULL	NULL	NULL
Je me trompe quelque part dans mes requêtes ou alors il y a quelque chose que j'ignore ?

Note : Oracle 9i