Vzhledem k tomuto DDL pro tabulky odpovídající vašim relevantním vztahům:
create table Boats(
bid int,
bname varchar(50),
color varchar(50)
);
create table Reserves(
sid int,
bid int,
day date
);
Vzorec dělení (3) můžete přepsat do syntaxe Oracle SQL poměrně přímočaře, i když je podrobný:
-- 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
Jak je uvedeno, používá pouze CROSS JOIN
a MINUS
operace tak, aby přímo odpovídaly vzorci relační algebry. V databázové aplikaci v reálném světě by však člověk jistě získal stejný výsledek pomocí zcela jiného dotazu.
Všimněte si také, že databáze SQL mohou a také porušují princip formální relační algebry, že vztahy neobsahují duplicitní n-tice. To je důvod pro SELECT DISTINCT
v prvním dílčím dotazu. Odlišný výběr použitý strategicky jinde v dotazu by jej mohl zefektivnit, ale nezměnil by výsledek.