1 pièce(s) jointe(s)
SQL Informix - Jointure externe
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 :
Code:
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"
; |
N’obtenant pas ce que je souhaitais, j’ai réduit la requête à cette expression :
Code:
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"
; |
Le résultat apparaît ci-dessous : 92 lignes (il y a 92 lots distincts). Mais :
-je ne demande qu’un seul lot
-les données provenant de la table A2741 ne sont pas renseignées, sauf sur 1 enregistrement
Citation:
;;;;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;
Si je modifie la requête pour inverser les rubriques sur lesquelles je fais la sélection :
Code:
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"
; |
J’obtiens le résultat suivant :
Citation:
DR;20080110;1;031;DR;20080110;1;031;
TOUT A FAIT SATISFAISANT étant donné que je ne sélectionne qu’un seul lot.
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