Dado este DDL para tabelas correspondentes às suas relações relevantes:
create table Boats(
bid int,
bname varchar(50),
color varchar(50)
);
create table Reserves(
sid int,
bid int,
day date
);
Você pode transliterar a fórmula de divisão (3) para a sintaxe Oracle SQL de maneira bastante direta, embora seja detalhada:
-- 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
Conforme especificado, isso usa apenas o
CROSS JOIN
e MINUS
operações, de modo a corresponder diretamente à fórmula da álgebra relacional. Em um aplicativo de banco de dados do mundo real, no entanto, certamente obteria o mesmo resultado por meio de uma consulta totalmente diferente. Observe também que os bancos de dados SQL podem violar o princípio da álgebra relacional formal de que as relações não contêm tuplas duplicadas. Essa é a razão para
SELECT DISTINCT
na primeira subconsulta. A seleção distinta aplicada estrategicamente em outra parte da consulta pode torná-la mais eficiente, mas não alteraria o resultado.