onedaywhenの答えに基づいて構築:
はい、集合差演算子の欠如は害を及ぼします。絶対に許すべきです。ただし、集合の補数と交差で集合の差を表すことができます。
B - A = B ∩ A'
つまり、B と A の差は、実際には B と A の補数の交差です。許可された演算子として交点があり、リレーションの適切な補数は醜いものですが、R に対する R1 ⊆ R の補数 (つまり、R1 にない R のもの) は結合で簡単に見つけることができます。 :
SELECT DISTINCT R0.x
FROM R as R1
JOIN R as R0 ON R1.x<>R0.x
WHERE R1.x=val
のRに対する補数です
SELECT DISTINCT R.x FROM R WHERE R.x=val
だから、ここになぞなぞの解決策があると思います.2人以上の男が予約したすべてのボートを取得するのは簡単です:予約表にあるすべてのボートを選択し、結果のデカルト積をそれ自体で取り、次に選択します異なる船員 1 と船員 2 を持つ各行。扱いにくい関係代数の表記法で、彼らは私に教えてくれました:
π( R.bid ) (
σ( R.bid=R2.bid and R.sid<R2.sid )( R x ρ(R, R2) )
)
(ここで、π は射影演算子、σ は選択演算子、ρ は名前変更演算子です)
これにより、2 人以上が予約したすべてのボートの ID が取得されます。今、私は 2 人以下の男性によって予約されたすべてのボートを手に入れるつもりです。これを行うには、3 人以上の男が予約しているすべてのボートを選択し、そのセットに存在しない元のテーブルからすべての行を選択して、セットの補数を取得します。きれいではありませんが、次のようになります。
π(R.bid)(σ(R.bid<>R1.bid)(
π(R.bid)(R)
x
π(R1.bid) (
σ( R1.bid=R2.bid and R2.bid=R3.bid and R1.sid<R2.sid and R2.sid<R3.sid )( ρ(R, R1) x ρ(R, R2) x ρ(R, R3) )
)
))
ご覧のとおり、プロパティを持つすべての行を選択し、次にこれらではない元のテーブルからすべての行を選択して、プロパティを持たないすべての行をネットします。ここでは、3 人によって予約されていないすべてのボートを意味します2人以下で予約したボート。
正確に 2 人の男が予約しているボートを取得するには、これを複数の男が予約したボートのセットと単純に交差させます。
π( R.bid ) (
σ( R.bid=R2.bid and R.sid<R2.sid )( R x ρ(R, R2) )
) ∩ π( R.bid ) (
σ(R.bid<>R1.bid)(
π(R.bid)(R)
x
π(R1.bid) (
σ( R1.bid=R2.bid and R2.bid=R3.bid and R1.sid<R2.sid and R2.sid<R3.sid )( ρ(R, R1) x ρ(R, R2) x ρ(R, R3) )
)
)
)
うーん。痛いほど醜いです。もっといい表記を知りたいです。
SQL 的には、次のようになると思います。
(SELECT DISTINCT R1.bid
FROM Reserves AS R1
JOIN Reserves AS R2 ON R1.bid = R2.bid AND R1.sid < R2.sid
) INTERSECT (
SELECT DISTINCT R.bid
FROM Reserves AS R1
JOIN Reserves AS R2 ON R1.bid = R2.bid AND R1.sid < R2.sid
JOIN Reserves AS R3 ON R1.bid = R3.bid AND R2.sid < R3.sid
JOIN Reserves AS R ON R.bid<>R1.bid
)
これはまさに onedaywhen の解であることに注意してください。