複数のメダルを獲得したすべてのプレーヤーの名前を取得します。
(これが何を意味するのかは明確ではありません。1種類以上のメダルを獲得したことがありますか?または複数のメダルを受け取ったことがありますか?あなたの回答例は後者を示唆しています。また、「null」を特別なSQLのようにではなく、別の種類のメダルとして扱います.)
-- rows where
THERE EXISTS compId,sport,medal,compId1,compId2,medal2 SUCH THAT
in competition [compId] of sport [sport] player [playerName] won [medal]
AND in competition [compId2] of sport [sport2] player [playerName] won [medal2]
AND (compId <> compId2 OR sport <> sport2 OR medal <> medal2)
ステートメントの省略表現を使用する:
-- rows where
THERE EXISTS compId,sport,medal,compId1,compId2,medal2 SUCH THAT
Competition(compId, sport, playerName, medal)
AND Competition(compId2, sport2, playerName, medal2)
AND (compId <> compId2 OR sport <> sport2 OR medal <> medal2)
再配置 (σ ごとに 1 つの比較と ∪ ごとに 1 つの属性セットの制限を予想):
-- rows where
THERE EXISTS compId,sport,medal,compId1,compId2,medal2 SUCH THAT
( Competition(compId, sport, playerName, medal)
AND Competition(compId2, sport2, playerName, medal2)
AND compId <> compId2)
OR ( Competition(compId, sport, playerName, medal)
AND Competition(compId2, sport2, playerName, medal2)
AND sport <> sport2)
OR ( Competition(compId, sport, playerName, medal)
AND Competition(compId2, sport2, playerName, medal2)
AND medal <> medal2)
代数を置き換えるには、次のようにします。
- テーブル/関係によるすべてのステートメント
- ⋈ によるテーブル/リレーションのすべての AND (自然結合)
- ∪ (共用体) によるテーブル/リレーション (同じ列/属性を持つ必要がある) のすべての OR
- すべての AND NOT (同じ列/属性を持つ必要があります) by \ (差分)
- σ比較によるAND比較ごと(選択/制限)
- EXISTS 個のすべての名前をドロップする π個の名前を保持する(射影)
ρ (名前の変更) によるすべての列/属性の名前変更。
π playerName (
σ compId <> compId2 (Competition
⋈ ρ compID2/compID ρ sport2/sport ρ medal2/medal Competition)
∪ σ sport <> sport2 (Competition
⋈ ρ compID2/compID ρ sport2/sport ρ medal2/medal Competition)
∪ σ medal <> medal2 (Competition
⋈ ρ compID2/compID ρ sport2/sport ρ medal2/medal Competition)
)
(詳細については、この回答を参照してください。)