# This is defined in a common file $schema = { tables => { person => { name => { type => 'string', max_length => 40 } }, address => { street => { type => 'string', max_length => 60 }, city => { type => 'string', max_length => 30 }, state => { type => 'string', max_length => 30 }, zip => { type => 'string', max_length => 10 } }, school => { name => { type => 'string', max_length => 30 }, side => { type => 'string', max_length => 6 }, num_students => { type => 'number' } } }, relationships => { many_to_many => [ [ person, school ], [ person, address ] ], one_to_many => [ [ school, address ] ] } }; use DBI; my $dbi = DBI->connect('DBI:mysql:database=bleh;host=localhost', 'user', 'passwd'); my $db = new SetDB($dbi, $schema); # ... then later in the body of the code ... $everyone = $db->newSet( tables => [person, [school, address]]); # This is subtle. See below while($person = $everyone->FetchNext()) { print "Name: " . $person->get("person.name") . "\n"; print "School: " . $person->get("school.name") . "\n"; print "School Street: " . $person->get("school.street") . "\n"; } $east_siders = $everyone->filter("school.side = 'east'"); $non_east_siders = $db->minus($everyone, $east_siders); $non_east_siders = $everyone->minus($east_siders); $non_east_siders = $everyone - $east_siders; # subtraction $everyone2 = $non_east_siders + $east_siders; # union $everyone2 = $non_east_siders || $east_siders; # union $everyone2 = $non_east_siders && $east_siders; # intersection $c = $a + $b