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 :
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 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'))
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
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
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
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
Je me trompe quelque part dans mes requêtes ou alors il y a quelque chose que j'ignore ?
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
Note : Oracle 9i
Partager