Utilisation d'une jointure conditionnelle

Comment :

A l'aide de la syntaxe JOIN conditionnelle, vous pouvez établir des jointures selon des conditions autre que l'égalité entre champs. De plus, les champs d'hôte et de référence ne doivent pas nécessairement contenir des formats correspondants, et le champ de référence croisée ne doit pas être indexé.

La jointure conditionnelle est prise en charge pour FOCUS, et par VSAM, ADABAS, IMS, IDMS, et toutes les sources de données relationnelles. Comme chaque source de données a différentes capacités de traiter les critères WHERE complexes, l'optimisation de la syntaxe JOIN conditionnelle diffère selon les sources de données particulières faisant partie de la jointure ainsi que la complexité des critères WHERE.

La commande standard ? JOIN liste toutes les jointures actuellement actives, et indique celles qui sont basées sur les critères WHERE.


Haut de page

x
Syntaxe : Créer une jointure conditionnelle

La syntaxe de commande JOIN conditionnelle (basée WHERE) est

JOIN [LEFT_OUTER|INNER] FILE hostfile AT hfld1     [WITH hfld2] [TAG tag1]
     TO {UNIQUE|MULTIPLE} 
     FILE crfile AT crfld [TAG tag2] [AS joinname]
     [WHERE expression1;
     [WHERE expression2;
     ...]
END

où :

INNER
Spécifie une jointure interne. Si vous ne spécifiez pas de type de jointure dans la commande JOIN, la définition du paramètre ALL détermine le type de jointure à réaliser.
LEFT OUTER
Spécifie une jointure externe gauche. Si vous ne spécifiez pas de type de jointure dans la commande JOIN, la définition du paramètre ALL détermine le type de jointure à réaliser.
hostfile
Est le fichier Master hôte.
AT
Relie le segment parent, ou hôte, et le segment enfant, ou de référence, corrects. Les valeurs de champ utilisées comme paramètre AT ne sont pas utilisées pour créer le lien. Elles servent simplement de références de segment.
hfld1
Est le nom de champ du fichier Master dont le segment va être joint à la source de données de référence. Le nom de champ doit se situer dans le segment au plus bas niveau de la source de données référencée.
tag1
Est le nom de balise facultatif utilisé comme qualificateur unique pour les champs et les alias dans la source de données hôte.
hfld2
Est le nom du champ de source de données auquel une jointure conditionnelle basée sur DEFINE doit être associée. Pour une jointure conditionnelle basée sur DEFINE, le paramètre KEEPDEFINES doit avoir la valeur ON et les champs virtuels doivent être créés avant le lancement de la commande JOIN.
MULTIPLE
spécifie une relation « one-to-many » (origine unique, destination multiple) entre from_file et to_file. Veuillez noter qu'ALL est synonyme de MULTIPLE.
UNIQUE
spécifie une relation un à un entre from_file et to_file. Veuillez noter qu'ONE est un synonyme d'UNIQUE.

Remarque : indépendamment du caractère de la jointure interne ou externe (JOIN—INNER ou LEFT_OUTER—), la jointure vers UNIQUE ne retournera qu'une seule instance du fichier de référence croisée, et si cette instance ne correspond pas, en fonction de l'évaluation de l'expression WHERE, les valeurs par défaut (des espaces pour les champs alphanumériques et 0 pour les champs numériques) sont retournés. Il n'y a jamais de chemins courts ni de valeurs manquantes dans le fichier de références croisées.

crfile
Est le fichier Master de référence.
crfld
Est le nom du champ de jointure dans le fichier Master de référence. Il peut être n'importe quel champ du segment.
tag2
Est le nom de balise facultatif utilisé comme qualificateur unique pour les champs et les alias de la source de données hôte.
joinname
Est le nom associé à la structure jointe.
expression1, expression2
sont n'importe quelles expressions acceptables pour une commande DEFINE. Tous les champs utilisés dans ces expressions doivent se trouver dans un seul et même chemin.
FIN

La commande END est nécessaire pour quitter la commande et doit s'agir d'une ligne seule.

Remarque : la syntaxe JOIN sur une seule ligne n'est pas prise en charge.



Exemple : Utilisation d'une jointure conditionnelle

L'exemple suivant joint les sources de données VIDEOTRK et MOVIES à condition que :

La jointure s'effectue au segment contenant MOVIECODE dans la source de données VIDEOTRK, car la jointure doit s'effectuer au segment référencé le plus bas.

La requête suivante affiche le titre, la date de transaction la plus récente et la date de sortie de chaque film faisant partie de la jointure, et calcule le nombre d'années entre cette date de transaction et la date de sortie :

JOIN FILE VIDEOTRK AT MOVIECODE TAG V1 TO ALL 
     FILE MOVIES   AT RELDATE   TAG M1 AS JW1
  WHERE DATEDIF(RELDATE, TRANSDATE,'Y') GT 10;
  WHERE V1.MOVIECODE EQ M1.MOVIECODE;
END
TABLE FILE VIDEOTRK
 SUM TITLE/A25 AS 'Title'
     TRANSDATE AS 'Last,Transaction'
     RELDATE AS 'Release,Date'
 COMPUTE YEARS/I5 = (TRANSDATE - RELDATE)/365;  AS 'Years,Difference'
 BY TITLE NOPRINT
 BY HIGHEST 1 TRANSDATE NOPRINT
END

La sortie est :

                           Last         Release   Years
Title                      Transaction  Date      Difference
-----                      -----------  -------   ----------
ALICE IN WONDERLAND        91/06/22     51/07/21          39
ALIEN                      91/06/18     80/04/04          11
ALL THAT JAZZ              91/06/25     80/05/11          11
ANNIE HALL                 91/06/24     78/04/16          13
BAMBI                      91/06/22     42/07/03          49
BIRDS, THE                 91/06/23     63/09/27          27
CABARET                    91/06/25     73/07/14          17
CASABLANCA                 91/06/27     42/03/28          49
CITIZEN KANE               91/06/22     41/08/11          49
CYRANO DE BERGERAC         91/06/20     50/11/09          40
DEATH IN VENICE            91/06/26     73/07/27          17
DOG DAY AFTERNOON          91/06/23     76/04/04          15
EAST OF EDEN               91/06/20     55/01/12          36
GONE WITH THE WIND         91/06/24     39/06/04          52
JAWS                       91/06/27     78/05/13          13
MALTESE FALCON, THE        91/06/19     41/11/14          49
MARTY                      91/06/19     55/10/26          35
NORTH BY NORTHWEST         91/06/21     59/02/09          32
ON THE WATERFRONT          91/06/24     54/07/06          36
PHILADELPHIA STORY, THE    91/06/21     40/05/06          51
PSYCHO                     91/06/17     60/05/16          31
REAR WINDOW                91/06/17     54/12/15          36
SHAGGY DOG, THE            91/06/25     59/01/09          32
SLEEPING BEAUTY            91/06/24     75/08/30          15
TIN DRUM, THE              91/06/17     80/03/01          11
VERTIGO                    91/06/27     58/11/25          32

WebFOCUS