Bonjour,
J'ai une question liée à l'utilisation des jointures externes, ici sous Informix (mais la question est globale).
La table A2742 contient des lots de factures.
La table A2741 contient des factures.
Le lien entre les deux tables se fait par la clé primaire de la A2742 :
-CMNELOTD_R
-DTRTLOTD_R
-NORDLOTD_R
-NDPTCPUD_R
On souhaite obtenir une liste de lots correspondant à des critères basés sur des rubriques de l’une ou l’autre table. En l’occurrence :
-DTRTLOTD_R (A2742 et A2741)
-CGRG_GES (A2741)
-NETSGEO (A2741)
-NDPT_GES (A2741)
-DCRELOT (A2741)
La requête ci-dessous est élaborée automatiquement à partir d’informations saisies dans un AGL :
N’obtenant pas ce que je souhaitais, j’ai réduit la requête à cette expression :
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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47 SELECT DISTINCT A2741.NP_JMAL, A2741.CMNELOTD_R, A2741.DTRTLOTD_R, A2741.NORDLOTD_R, A2741.NDPTCPUD_R, A2741.CGRG_GES, A2741.NDPT_GES, A2741.NETSGEO, A2741.NLOTPDS, A2741.DCRELOT, A2741.VSRL_A2741, A2742.CMNELOTD_R, A2742.DTRTLOTD_R, A2742.NORDLOTD_R, A2742.NDPTCPUD_R, A2742.NEMTNRT, A2742.NDESNRT, A2742.LNOMFICNRT, A2742.NLOTPDS, A2742.DCRELOT, A2742.CNRT_001, A2742.NVERNOR, A2742.VSRL_A2742 FROM OUTER A2741, A2742 WHERE 1=1 AND A2742.CMNELOTD_R = A2741.CMNELOTD_R AND A2742.DTRTLOTD_R = A2741.DTRTLOTD_R AND A2742.NDPTCPUD_R = A2741.NDPTCPUD_R AND A2742.NORDLOTD_R = A2741.NORDLOTD_R AND A2741.NP_JMAL >= "A" AND (A2742.NLOTPDS = 0 OR 0 =0) AND (A2741.NETSGEO = "03078015" OR 0 = 1) AND (A2741.CGRG_GES = "02" OR 0 = 1) AND (A2741.NDPT_GES = "046" OR 0 = 1) AND (A2741.DTRTLOTD_R = "20080302" OR 0 = 1) AND A2741.DCRELOT BETWEEN "20070903" AND "20071231" ;
Le résultat apparaît ci-dessous : 92 lignes (il y a 92 lots distincts). Mais :
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 SELECT DISTINCT A2741.CMNELOTD_R, A2741.DTRTLOTD_R, A2741.NORDLOTD_R, A2741.NDPTCPUD_R, A2742.CMNELOTD_R, A2742.DTRTLOTD_R, A2742.NORDLOTD_R, A2742.NDPTCPUD_R FROM A2742, OUTER A2741 WHERE A2741.CMNELOTD_R = A2742.CMNELOTD_R AND A2741.DTRTLOTD_R = A2742.DTRTLOTD_R AND A2741.NDPTCPUD_R = A2742.NDPTCPUD_R AND A2741.NORDLOTD_R = A2742.NORDLOTD_R AND A2741.CMNELOTD_R = "DR" AND A2741.DTRTLOTD_R = "20080110" AND A2741.NORDLOTD_R = 1 AND A2741.NDPTCPUD_R = "031" ;
-je ne demande qu’un seul lot
-les données provenant de la table A2741 ne sont pas renseignées, sauf sur 1 enregistrement
Si je modifie la requête pour inverser les rubriques sur lesquelles je fais la sélection :;;;;DR;20080102;1;082;
;;;;DR;20080102;2;082;
;;;;DR;20080102;3;082;
;;;;DR;20080102;4;082;
;;;;DR;20080102;5;082;
;;;;DR;20080102;6;082;
;;;;DR;20080102;7;082;
;;;;DR;20080102;8;082;
;;;;DR;20080102;9;082;
;;;;DR;20080102;10;082;
;;;;DR;20080110;2;031;
;;;;DR;20080110;3;031;
;;;;DR;20080110;4;031;
;;;;DR;20080110;5;031;
;;;;DR;20080110;6;031;
;;;;DR;20080110;7;031;
;;;;DR;20080110;8;031;
;;;;DR;20080110;9;031;
;;;;DR;20080110;10;031;
;;;;DR;20080120;1;031;
;;;;DR;20080120;2;031;
;;;;DR;20080120;3;031;
;;;;DR;20080120;4;031;
;;;;DR;20080120;5;031;
;;;;DR;20080120;6;031;
;;;;DR;20080120;7;031;
;;;;DR;20080120;8;031;
;;;;DR;20080120;9;031;
;;;;DR;20080120;10;031;
;;;;DR;20080130;1;031;
;;;;DR;20080130;2;031;
;;;;DR;20080130;3;031;
;;;;DR;20080130;4;031;
;;;;DR;20080130;5;031;
;;;;DR;20080130;6;031;
;;;;DR;20080130;7;031;
;;;;DR;20080130;8;031;
;;;;DR;20080130;9;031;
;;;;DR;20080130;10;031;
;;;;DR;20080202;1;046;
;;;;DR;20080202;2;046;
;;;;DR;20080202;3;046;
;;;;DR;20080202;4;046;
;;;;DR;20080202;5;046;
;;;;DR;20080202;6;046;
;;;;DR;20080202;7;046;
;;;;DR;20080202;8;046;
;;;;DR;20080202;9;046;
;;;;DR;20080202;10;046;
;;;;DR;20080211;1;031;
;;;;DR;20080211;2;031;
;;;;DR;20080211;3;031;
;;;;DR;20080211;4;031;
;;;;DR;20080211;5;031;
;;;;DR;20080211;6;031;
;;;;DR;20080211;7;031;
;;;;DR;20080211;8;031;
;;;;DR;20080211;9;031;
;;;;DR;20080211;10;031;
;;;;DR;20080212;1;031;
;;;;DR;20080212;2;031;
;;;;DR;20080212;3;031;
;;;;DR;20080212;4;031;
;;;;DR;20080212;5;031;
;;;;DR;20080212;6;031;
;;;;DR;20080212;7;031;
;;;;DR;20080212;8;031;
;;;;DR;20080212;9;031;
;;;;DR;20080212;10;031;
;;;;DR;20080213;1;031;
;;;;DR;20080213;2;031;
;;;;DR;20080213;3;031;
;;;;DR;20080213;4;031;
;;;;DR;20080213;5;031;
;;;;DR;20080213;6;031;
;;;;DR;20080213;7;031;
;;;;DR;20080213;8;031;
;;;;DR;20080213;9;031;
;;;;DR;20080213;10;031;
;;;;DR;20080213;11;031;
;;;;DR;20080213;12;031;
;;;;DR;20080302;1;031;
;;;;DR;20080302;2;031;
;;;;DR;20080302;3;031;
;;;;DR;20080302;4;031;
;;;;DR;20080302;5;031;
;;;;DR;20080302;6;031;
;;;;DR;20080302;7;031;
;;;;DR;20080302;8;031;
;;;;DR;20080302;9;031;
;;;;DR;20080302;10;031;
DR;20080110;1;031;DR;20080110;1;031;
J’obtiens le résultat suivant :
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 SELECT DISTINCT A2741.CMNELOTD_R, A2741.DTRTLOTD_R, A2741.NORDLOTD_R, A2741.NDPTCPUD_R, A2742.CMNELOTD_R, A2742.DTRTLOTD_R, A2742.NORDLOTD_R, A2742.NDPTCPUD_R FROM A2742, OUTER A2741 WHERE A2741.CMNELOTD_R = A2742.CMNELOTD_R AND A2741.DTRTLOTD_R = A2742.DTRTLOTD_R AND A2741.NDPTCPUD_R = A2742.NDPTCPUD_R AND A2741.NORDLOTD_R = A2742.NORDLOTD_R AND A2742.CMNELOTD_R = "DR" AND A2742.DTRTLOTD_R = "20080110" AND A2742.NORDLOTD_R = 1 AND A2742.NDPTCPUD_R = "031" ;
TOUT A FAIT SATISFAISANT étant donné que je ne sélectionne qu’un seul lot.DR;20080110;1;031;DR;20080110;1;031;
D’où ma question :
- lors de la mise en place d’une jointure externe, doit-on systématiquement procéder à la sélection sur les rubriques de la table « dominante » ?
Dans l’affirmative :
- que doit-on faire lorsque les rubriques sur lesquelles doit porter la sélection ne sont présentes que dans la table « subordonnée » ?
Je vous remercie par avance pour vos remarques, explications, réponses ...
DVi
Partager