Dado este DDL para tablas correspondientes a sus relaciones relevantes:
create table Boats(
bid int,
bname varchar(50),
color varchar(50)
);
create table Reserves(
sid int,
bid int,
day date
);
Puede transliterar la fórmula de división (3) a la sintaxis de Oracle SQL de manera bastante sencilla, aunque es detallada:
-- 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
Como se especifica, eso usa solo CROSS JOIN
y MINUS
operaciones, a fin de corresponder directamente a la fórmula del álgebra relacional. Sin embargo, en una aplicación de base de datos del mundo real, seguramente se obtendría el mismo resultado a través de una consulta completamente diferente.
Tenga en cuenta también que las bases de datos SQL pueden violar y violan el principio del álgebra relacional formal de que las relaciones no contienen tuplas duplicadas. Esa es la razón de SELECT DISTINCT
en la primera subconsulta. La selección distinta aplicada estratégicamente en otra parte de la consulta podría hacerla más eficiente, pero no alteraría el resultado.