The following jointypes produce the following types of results, based on the records matching produced by the joincondition:
Examples:
outrec := RECORD
people.id;
people.firstname;
people.lastname;
END;
RT_folk := JOIN(people(firstname[1] = 'R'),
people(lastname[1] = 'T'),
LEFT.id=RIGHT.id,
TRANSFORM(outrec,SELF := LEFT));
OUTPUT(RT_folk);
//*********************** Half KEYED JOIN example:
peopleRecord := RECORD
INTEGER8 id;
STRING20 addr;
END;
peopleDataset := DATASET([{3000,'LONDON'},{3500,'SMITH'},
{30,'TAYLOR'}], peopleRecord);
PtblRec doHalfJoin(peopleRecord l) := TRANSFORM
SELF := l;
END;
FilledRecs3 := JOIN(peopleDataset, SequenceKey,
LEFT.id=RIGHT.sequence,doHalfJoin(LEFT));
FilledRecs4 := JOIN(peopleDataset, AlphaKey,
LEFT.addr=RIGHT.Lname,doHalfJoin(LEFT));
//******************* Full KEYED JOIN example:
PtblRec := RECORD
INTEGER8 seq;
STRING2 State;
STRING20 City;
STRING25 Lname;
STRING15 Fname;
END;
PtblRec Xform(person L, INTEGER C) := TRANSFORM
SELF.seq := C;
SELF.State := L.per_st;
SELF.City := L.per_full_city;
SELF.Lname := L.per_last_name;
SELF.Fname := L.per_first_name;
END;
Proj := PROJECT(Person(per_last_name[1]=per_first_name[1]),
Xform(LEFT,COUNTER));
PtblOut := OUTPUT(Proj,,'~RTTEMP::TestKeyedJoin',OVERWRITE);
Ptbl := DATASET('RTTEMP::TestKeyedJoin',
{PtblRec,UNSIGNED8 __fpos {VIRTUAL(fileposition)}},
FLAT);
AlphaKey := INDEX(Ptbl,{lname,fname,__fpos},
'~RTTEMPkey::lname.fname');
SeqKey := INDEX(Ptbl,{seq,__fpos},'~RTTEMPkey::sequence');
Bld1 := BUILD(AlphaKey ,OVERWRITE);
Bld2 := BUILD(SeqKey,OVERWRITE);
peopleRecord := RECORD
INTEGER8 id;
STRING20 addr;
END;
peopleDataset := DATASET([{3000,'LONDON'},{3500,'SMITH'},
{30,'TAYLOR'}], peopleRecord);
joinedRecord := RECORD
PtblRec;
peopleRecord;
END;
joinedRecord doJoin(peopleRecord l, Ptbl r) := TRANSFORM
SELF := l;
SELF := r;
END;
FilledRecs1 := JOIN(peopleDataset, Ptbl,LEFT.id=RIGHT.seq,
doJoin(LEFT,RIGHT), KEYED(SeqKey));
FilledRecs2 := JOIN(peopleDataset, Ptbl,LEFT.addr=RIGHT.Lname,
doJoin(LEFT,RIGHT), KEYED(AlphaKey));
SEQUENTIAL(PtblOut,Bld1,Bld2,OUTPUT(FilledRecs1),OUTPUT(FilledRecs2))