+-------------+ +------------------+
| 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