Original Message:
Sent: Tue April 11, 2023 06:33 AM
From: ALEX FLEISCHER
Subject: How to do an outer join of tuplesets in OPL (or how to test for nullity and join efficiently)
Hi,
you can do that join with the SQL request. But if you do that in OPL , I tend to use sets instead of what you did.
//Tupleset definitionstuple rvPerson { key string Name; string StateCode;} tuple rvState { key string StateCode; string StateName;} tuple rvPersonState { key string PersonName; string StateName;} //Tupleset datasetof(rvPerson) relPersons = {<"Mark", "BC">, <"Joe", "VT">, <"Bill", "VT">}; setof(rvState) relStates = {<"BC", "Britsh-Columbia">, <"VT", "Vermont">}; setof(rvState) relStatesBis = {<"BC", "Britsh-Columbia">, <"QC", "Québec">}; //Inner Join{rvPersonState} relPersonsStates ={<p.Name, s.StateName> | p in relPersons, s in relStates : p.StateCode==s.StateCode}; //Outer Join{rvPersonState} relPersonsStatesBis ={<p.Name, (card({s | s in relStatesBis : p.StateCode==s.StateCode})==1?item(relStatesBis,<p.StateCode>).StateName:"null") > | p in relPersons}; /*ResultsrelPersonsStates={PersonName,StateNameMark,Britsh-ColumbiaJoe,VermontBill,Vermont} relStatesBis={PersonName,StateNameMark,Britsh-ColumbiaJoe,nullBill,null}*/execute{ writeln(relPersonsStatesBis );}{string} pStates={p.StateCode | p in relPersons};{string} states={s.StateCode | s in relStatesBis};{string} interStates=pStates inter states;{string} diffStates=pStates diff states;{rvPersonState} relPersonsStatesTer ={<p.Name, s.StateName> | p in relPersons, s in relStatesBis : p.StateCode==s.StateCode && p.StateCode in interStates}union{<p.Name, "null"> | p in relPersons: p.StateCode in diffStates};execute{ writeln(relPersonsStatesTer );}
------------------------------
[Alex] [Fleischer]
[Data and AI Technical Sales]
[IBM]
Original Message:
Sent: Thu April 06, 2023 05:25 PM
From: Marko BLAIS
Subject: How to do an outer join of tuplesets in OPL (or how to test for nullity and join efficiently)
I want to do something similar to a database outer join in OPL. Below, I found a way to do it. I test for nullity by using card function. Is there a better way to test for nullity in OPL?
//Tupleset definitions
tuple rvPerson {
key string Name;
string StateCode;
}
tuple rvState {
key string StateCode;
string StateName;
}
tuple rvPersonState {
key string PersonName;
string StateName;
}
//Tupleset data
setof(rvPerson) relPersons = {<"Mark", "BC">, <"Joe", "VT">, <"Bill", "VT">};
setof(rvState) relStates = {<"BC", "Britsh-Columbia">, <"VT", "Vermont">};
setof(rvState) relStatesBis = {<"BC", "Britsh-Columbia">, <"QC", "Québec">};
//Inner Join
{rvPersonState} relPersonsStates ={<p.Name, s.StateName> | p in relPersons, s in relStates : p.StateCode==s.StateCode};
//Outer Join
{rvPersonState} relPersonsStatesBis ={<p.Name, (card({s | s in relStatesBis : p.StateCode==s.StateCode})==1?item(relStatesBis,<p.StateCode>).StateName:"null") > | p in relPersons};
/*Results
relPersonsStates=
{
PersonName,StateName
Mark,Britsh-Columbia
Joe,Vermont
Bill,Vermont}
relStatesBis=
{
PersonName,StateName
Mark,Britsh-Columbia
Joe,null
Bill,null}
------------------------------
Marko BLAIS
------------------------------