我不确定该怎么称呼这个问题,但它并不完全是在计算行数。假设我们有关系:
Competition(compId, sport, playerName, medal)
让我们说属性奖章可以是金牌,银牌,铜牌或空牌。所以我们有以下数据:
(193, Tennis, John Doe, Gold)
(931, Skiing, Mary White, Bronze)
(193, Tennis, Arnold Black, null)
(182, Bobsledding, John Doe, Gold)
(901, Ping-Pong, Adam Brown, Silver)
(248, Bobsledding, Mary White, Silver)
我很难弄清楚如何回答这个问题:获取所有赢得一枚以上奖牌的球员的名字。在这些数据中,答案将是John Doe和Mary White。如何使用关系代数得到关于此关系的任意数据的答案?
(这是实际作业问题的简化版本,这种简化代表(我希望)我正在努力解决的问题的一部分。有一些任意和未知数量的比赛,体育和球员,但只有4种可能的奖牌)
答案 0 :(得分: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)
重新排列(预测每σ一个比较的限制和每个set一个属性集):
-- 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)
现在取代数:
每个列/属性重命名为ρ(重命名)。
π 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)
)
(有关详情,请参阅this answer。)
答案 1 :(得分:0)
答案 2 :(得分:0)
我知道这是一篇非常古老的文章,但是我正在学习该主题,并且确实找到了另一种表达练习要求的方法。也许对搜索此内容的人可能有用。
答案:
π Lc.playerName (
ρ Lc σ medal ≠ 'null' Competition
⨝ Lc.playerName = Rc.playerName AND Lc.sport ≠ Rc.sport
ρ Rc σ medal ≠ 'null' Competition)
我假设在同一项运动中没有人能获得两枚奖牌,如果某人获得的奖牌不止一个,那么它就必须从事不同的运动。我还假设关系中的每个元组都代表一个奖励,所以...
上面的表达式设法使播放器名称针对不同的运动出现多次。
已编辑:我将其视为空值... 您可以使用此工具https://dbis-uibk.github.io/relax/calc.htm
看到它的实际效果要设置数据,请在“组编辑器”标签中使用此代码
group:Competition
Competition = {
compId:number, sport:string , playerName:string, medal:string
193 , 'Tennis' , 'John Doe' , 'Gold'
931 , 'Skiing' , 'Mary White' , 'Bronze'
193 , 'Tennis' , 'Arnold Black' , 'null'
182 , 'Bobsledding', 'John Doe' , 'Gold'
901 , 'Ping-Pong' , 'Adam Brown' , 'Silver'
248 , 'Bobsledding', 'Mary White' , 'Silver'
}