MainframeSupports
tip uge 36/2017:

Join af data i SQL baserede databasesystemer som DB2 tager vi som en selvfølge, men at joine data i datasets er en helt anden sag. De af os, der har haft behovet, har garanteret load'et data ind i nogle DB2 tabeller, men det er der rent faktisk ikke nogen grund til. SORT har i længere tid (jeg ved ikke hvor længe, men sandsynligvis de sidste 5 til 10 år) haft en funktion til at joine data i datasets. Og som sædvanligt, når det er SORT programmet, der kan noget, så går det rasende stærkt.

For at vise, hvordan det fungerer, kræves der selvfølgelig ikke de store datamængder, så her er et lille eksempel, som er lige til at klippe/klistre og køre:

//JOINING  EXEC PGM=SORT
//SORTJNF1 DD *
OTHERKEY1 KEY1 OTHERDATA A
OTHERKEY2 KEY1 OTHERDATA B
OTHERKEY3 KEY2 OTHERDATA C
OTHERKEY4 KEY2 OTHERDATA D
OTHERKEY5 KEY2 OTHERDATA E
OTHERKEY6 KEY2 OTHERDATA F
OTHERKEY6 KEY3 OTHERDATA F
//SORTJNF2 DD *
KEY1 SOMEDATA
KEY1 MOREDATA
KEY2 OTHERDATA
KEY4 OTHERDATA
//SORTOUT  DD SYSOUT=*
//SYSOUT   DD SYSOUT=*
//SYSIN    DD *
    JOINKEYS FILE=F1,FIELDS=(11,4,A)
    JOINKEYS FILE=F2,FIELDS=(1,4,A)
    JOIN UNPAIRED,F1
    REFORMAT FIELDS=(F1:1,27,F2:1,15),FILL=C'-'
    SORT FIELDS=COPY
/*
//

I stedet for det sædvanlige SORTIN DD-navn, så skal du i stedet anvende SORTJNF1 til det ene dataset og SORTJNF2 til det andet. Det er ikke muligt at joine flere datasets end to i samme kørsel. Til gengæld kan der bruges hele tre forskellige SORT kommandoer til at udføre en join, og der skal som minimum bruges to. JOINKEYS kommandoen bruges til at fortælle, hvilke positioner i de to filer, der skal matche, for at SORT kan joine to records fra hver fil. Der angives to JOINKEYS kommandoer, en for hver SORTJN** DD-navn. Så behøver positionerne, der skal joines, ikke at være de samme i begge filer, hvilket de heller ikke er i dette eksempel.

Den anden kommando, der skal anvendes, er REFORMAT, som angiver, hvilke positioner fra de to filer, der joines, der skal sendes videre til normal SORT behandling. Resultatet af en join i SORT skal altså opfattes som de data, der normalt befinder sig i SORTIN DD-navnet. Derfor er mulighederne for manipulering af data i REFORMAT ret begrænsede, da man kan benytte INREC og OUTREC til at lave om på data, og som det fremgår af eksemplet, så skal der være en SORT kommando. I dette eksempel vil jeg gerne have positionerne 1-27 fra SORTJNF1 ud i SORTOUT. Herefter vil jeg gerne have positionerne 1-15 fra SORTJNF2.

Hvis man kun benytter JOINKEYS og REFORMAT, så får man lavet det, der svarer til en inner join i SQL. Med JOIN kommandoen kan man lave outer joins. I dette eksempel angiver UNPAIRED,F1 at records i F1, der ikke matcher nogen rækker i F2, skal tages med i resultatet. FILL på REFORMAT kommandoen angiver, hvilke værdier, der indsættes i positionerne for F2, da der jo ikke er nogen data fra F2. Resultatet på SORTOUT vil efter en eksekvering af ovenstående step se således ud:

OTHERKEY1 KEY1 OTHERDATA A KEY1 SOMEDATA
OTHERKEY1 KEY1 OTHERDATA A KEY1 MOREDATA
OTHERKEY2 KEY1 OTHERDATA B KEY1 SOMEDATA
OTHERKEY2 KEY1 OTHERDATA B KEY1 MOREDATA
OTHERKEY3 KEY2 OTHERDATA C KEY2 OTHERDATA
OTHERKEY4 KEY2 OTHERDATA D KEY2 OTHERDATA
OTHERKEY5 KEY2 OTHERDATA E KEY2 OTHERDATA
OTHERKEY6 KEY2 OTHERDATA F KEY2 OTHERDATA
OTHERKEY6 KEY3 OTHERDATA F ---------------

Som du kan se, så svarer resultatet fundstændig til det resultat, du ville have fået med SQL. Der var lige en enkelt record på F1, som ikke matchede nogen record i F2, så der blev positionerne i resultatet, der skulle komme fra F2, udfyldt med bindestreger. Jeg må indrømme, at jeg er fuldstændig vild med join mulighederne i SORT. De har sat mig i stand til at gøre ting, som jeg før måtte lave en masse kode for at opnå. Og så går det helt utroligt stærkt. Jeg håber, du får lige så meget glæde af join i SORT, som jeg har.

Forrige danske tip        Last tip in english        Tip oversigten