+-------------+ +------------------+ | Products | | Supplier_Product | +-------------+ +------------------+ | PNO | PNAME | | SNO | PNO | +-----+-------+ +---------+--------+ | P1 | Screw | | S1 | P1 | | P1 | Screw | | S1 | P1 | | P1 | Screw | | S1 | P2 | | P2 | Screw | +------------------+ +-------------+ #### SELECT parts.pno FROM parts WHERE parts.pname = 'Screw' OR parts.pno IN (SELECT supplier_parts.pno FROM supplier_parts WHERE supplier_parts.sno = 'S1') #### SELECT supplier_parts.pno FROM supplier_parts WHERE supplier_parts.sno = 'S1' OR supplier_parts.pno IN (SELECT parts.pno FROM parts WHERE parts.pname = 'Screw') #### SELECT parts.pno FROM parts, supplier_parts WHERE ( supplier_parts.sno = 'S1' AND supplier_parts.pno = parts.pno ) OR parts.pname = 'Screw' #### #!/usr/bin/perl use strict; use warnings; use Data::Dumper; use DBI; my $DATABASE = 'distinct.db'; my $P = 'parts'; my $SP = 'supplier_parts'; my $dbh = DBI->connect( "dbi:SQLite:dbname=$DATABASE", "", "" ); create_tables($dbh); insert_data($dbh); display_results(select_statements()); display_results(distinct_select_statements()); unlink $DATABASE or die "Could not unlink $DATABASE: $!"; sub display_results { my @sql_statements = @_; foreach my $select ( @sql_statements ) { my @results = @{ $dbh->selectall_arrayref($select) }; my %results_for; foreach my $result (@results) { no warnings 'uninitialized'; $results_for{$select}{ $result->[0] }++; } while ( my ( $sql, $results ) = each %results_for ) { print "$sql\n\tResults: P1: $results->{P1} P2: $results->{P2}\n\n --\n"; } } } sub create_tables { my $dbh = shift; $dbh->do("CREATE TABLE $P ( pno, pname )"); $dbh->do("CREATE TABLE $SP ( sno, pno )"); } sub insert_data { my $dbh = shift; $dbh->do("INSERT INTO $P VALUES ('P1', 'Screw')"); $dbh->do("INSERT INTO $P VALUES ('P1', 'Screw')"); $dbh->do("INSERT INTO $P VALUES ('P1', 'Screw')"); $dbh->do("INSERT INTO $P VALUES ('P2', 'Screw')"); $dbh->do("INSERT INTO $SP VALUES ('S1', 'P1')"); $dbh->do("INSERT INTO $SP VALUES ('S1', 'P1')"); $dbh->do("INSERT INTO $SP VALUES ('S1', 'P2')"); } sub distinct_select_statements { my @statements = map { s/SELECT/SELECT DISTINCT/g; $_ } select_statements(); } sub select_statements { my @statements; push @statements => <<" END_SQL"; SELECT $P.pno FROM $P WHERE $P.pname = 'Screw' OR $P.pno IN (SELECT $SP.pno FROM $SP WHERE $SP.sno = 'S1') END_SQL push @statements => <<" END_SQL"; SELECT $SP.pno FROM $SP WHERE $SP.sno = 'S1' OR $SP.pno IN (SELECT $P.pno FROM $P WHERE $P.pname = 'Screw') END_SQL push @statements => <<" END_SQL"; SELECT $P.pno FROM $P, $SP WHERE ( $SP.sno = 'S1' AND $SP.pno = $P.pno ) OR $P.pname = 'Screw' END_SQL return @statements; } #### SELECT city FROM cities, customers WHERE customers.city_id = cities.city_id AND customers.credit_rating > 700