Givet denna DDL för tabeller som motsvarar dina relevanta relationer:
create table Boats(
bid int,
bname varchar(50),
color varchar(50)
);
create table Reserves(
sid int,
bid int,
day date
);
Du kan translitterera divisionsformeln (3) till Oracle SQL-syntax ganska enkelt, även om den är utförlig:
-- All sailors who reserved at least one boat
SELECT DISTINCT sid
FROM Reserves
MINUS
-- All sailors who reserved at least one boat, but not all of them
SELECT sid
FROM (
-- all combinations of a sailor who reserved any boat with any boat
-- available to be reserved:
SELECT Reserves.sid, Boats.bid
FROM
Reserves
CROSS JOIN
Boats
MINUS
-- all combinations of sailor and boat for actual reservations made
SELECT sid, bid
FROM Reserves
) sids
Som specificerat använder det endast CROSS JOIN
och MINUS
operationer, så att de direkt motsvarar den relationella algebraformeln. I en verklig databasapplikation skulle man dock säkert få samma resultat via en helt annan fråga.
Observera också att SQL-databaser kan bryta mot principen för formell relationalgebra att relationer inte innehåller dubbletter av tupler. Det är anledningen till SELECT DISTINCT
i den första underfrågan. Distinkt urval som tillämpas strategiskt på andra ställen i frågan kan göra det mer effektivt, men skulle inte förändra resultatet.