関連する関係に対応するテーブルにこのDDLを指定すると、次のようになります。
create table Boats(
bid int,
bname varchar(50),
color varchar(50)
);
create table Reserves(
sid int,
bid int,
day date
);
除算式(3)は、冗長ですが、かなり簡単にOracleSQL構文に音訳できます。
-- 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
指定されているように、それはCROSS JOIN
のみを使用します およびMINUS
関係代数の公式に直接対応するように操作します。ただし、実際のデータベースアプリケーションでは、まったく異なるクエリを使用して同じ結果を確実に取得できます。
また、SQLデータベースは、関係に重複するタプルが含まれないという正式な関係代数の原則に違反する可能性があり、実際に違反していることにも注意してください。それがSELECT DISTINCT
の理由です 最初のサブクエリで。クエリの他の場所で戦略的に適用された個別の選択は、より効率的になる可能性がありますが、結果は変わりません。