我不太确定这个问题是什么,但它并不完全是在计算行数。假设我们有这样的关系:
Competition(compId, sport, playerName, medal)
假设medal属性可以是金、银、铜或null。因此,我们有以下数据:
(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)
我很难想出如何回答这个问题:获得所有获得一枚以上奖牌的球员的名字。在这个数据中,答案是无名氏和玛丽·怀特。我如何使用关系代数在任意数据上获得该关系答案?
(这是实际作业问题的简化版本,这种简化(我希望)代表了我正在努力解决的问题的一部分。有任意和未知的比赛,运动和运动员的数量,但只有4种可能的奖牌)
发布于 2014-09-23 07:07:12
会得到所有获得过不止一枚奖牌的选手的名字。
(目前还不清楚这意味着什么。获得过一种以上的奖牌吗?或者获得过一枚以上的奖牌?您的示例答案表明是后者。此外,它还将"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)
重新排列(预计每个σ一个比较和每个∪一个属性集的限制):
-- 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)
现在来替换代数:
通过table/relation
竞赛奖牌playerName (竞赛compId <> compId2 (竞赛<> compID2/compIDρsport2/sportρmedal2 /奖牌竞赛))∪σsport <> sport2 (竞赛ρcompID2/compID∪σsport2/sportρMEDADAL2/奖牌竞赛)⋈ρmedal2(∪σ⋈ρcompID2/compIDρsport2/sportρMEDADAL2/ medal ) )
(有关详细信息,请参阅this answer。)
发布于 2018-04-18 02:15:34
在我看来,有一种更简单的方法来解决这个问题:
本质上,您找到medal不为空的记录之间的关系,然后将此记录与其自身连接在一起,按名称连接。生成的记录将是名称重复的记录。
发布于 2019-05-04 02:25:56
我知道这是一个非常古老的帖子,但我正在学习这个主题,我确实找到了另一种方法来表达练习的要求。也许这对搜索它的人很有用。
答案是:
π Lc.playerName (
ρ Lc σ medal ≠ 'null' Competition
⨝ Lc.playerName = Rc.playerName AND Lc.sport ≠ Rc.sport
ρ Rc σ medal ≠ 'null' Competition)
我假设没有人可以在同一个项目中获得两枚奖牌,如果一个人拥有不止一枚奖牌,那么他必须在不同的项目上获得奖牌。我还假设关系中的每个元组代表一个奖励,所以...
上面的表达式成功地获得了多次出现在不同运动中的playerName。
编辑的:我处理了null...您可以使用此工具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'
}
https://stackoverflow.com/questions/18752873
复制相似问题