首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用于计算行的关系代数

用于计算行的关系代数
EN

Stack Overflow用户
提问于 2013-09-12 07:16:02
回答 3查看 25.4K关注 0票数 6

我不太确定这个问题是什么,但它并不完全是在计算行数。假设我们有这样的关系:

代码语言:javascript
运行
复制
Competition(compId, sport, playerName, medal)

假设medal属性可以是金、银、铜或null。因此,我们有以下数据:

代码语言:javascript
运行
复制
(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种可能的奖牌)

EN

回答 3

Stack Overflow用户

发布于 2014-09-23 07:07:12

会得到所有获得过不止一枚奖牌的选手的名字。

(目前还不清楚这意味着什么。获得过一种以上的奖牌吗?或者获得过一枚以上的奖牌?您的示例答案表明是后者。此外,它还将"null“视为另一种奖章,而不是SQL中的特殊奖章。)

代码语言:javascript
运行
复制
-- 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)

使用语句速记:

代码语言:javascript
运行
复制
-- 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)

重新排列(预计每个σ一个比较和每个∪一个属性集的限制):

代码语言:javascript
运行
复制
-- 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

  • every (union)

  • every NOT (必须具有相同的列/属性) AND NOT(必须具有相同的列/属性) AND comparison comparison (select/restrict)
  • every EXISTS names to drop by
  • by names names to to drop by∪names to keep (projection)
    • every column/attribute
    • ρ(rename)。

竞赛奖牌playerName (竞赛compId <> compId2 (竞赛<> compID2/compIDρsport2/sportρmedal2 /奖牌竞赛))∪σsport <> sport2 (竞赛ρcompID2/compID∪σsport2/sportρMEDADAL2/奖牌竞赛)⋈ρmedal2(∪σ⋈ρcompID2/compIDρsport2/sportρMEDADAL2/ medal ) )

(有关详细信息,请参阅this answer。)

票数 2
EN

Stack Overflow用户

发布于 2018-04-18 02:15:34

在我看来,有一种更简单的方法来解决这个问题:

本质上,您找到medal不为空的记录之间的关系,然后将此记录与其自身连接在一起,按名称连接。生成的记录将是名称重复的记录。

票数 0
EN

Stack Overflow用户

发布于 2019-05-04 02:25:56

我知道这是一个非常古老的帖子,但我正在学习这个主题,我确实找到了另一种方法来表达练习的要求。也许这对搜索它的人很有用。

答案是:

代码语言:javascript
运行
复制
π 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查看它的实际效果

要设置数据,请在组编辑器选项卡中使用此代码

代码语言:javascript
运行
复制
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'    
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18752873

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档