Gezien deze DDL voor tabellen die overeenkomen met uw relevante relaties:
create table Boats(
bid int,
bname varchar(50),
color varchar(50)
);
create table Reserves(
sid int,
bid int,
day date
);
U kunt de delingsformule (3) vrij eenvoudig translitereren in Oracle SQL-syntaxis, hoewel het uitgebreid is:
-- 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
Zoals gespecificeerd, gebruikt dat alleen de CROSS JOIN
en MINUS
bewerkingen, zodat ze direct overeenkomen met de relationele algebra-formule. In een echte databasetoepassing zou men echter zeker hetzelfde resultaat krijgen via een geheel andere zoekopdracht.
Merk ook op dat SQL-databases het principe van formele relationele algebra kunnen schenden dat relaties geen dubbele tupels bevatten. Dat is de reden voor SELECT DISTINCT
in de eerste subquery. Duidelijke selectie die strategisch elders in de zoekopdracht wordt toegepast, zou deze efficiënter kunnen maken, maar zou het resultaat niet veranderen.