6

我不太确定如何称呼这个问题,但它并没有准确计算行数。假设我们有关系:

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 种可能性奖牌)

4

3 回答 3

2

获取所有获得超过一枚奖牌的球员的姓名。

(不清楚这意味着什么。赢得了不止一种奖牌?还是获得了不止一种奖牌?您的示例答案建议后者。此外,它把“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)

现在得到代数替换:

  • 每个语句按其表/关系
  • ⋈(自然连接)的表/关系的每个 AND
  • ∪(联合)的表/关系(必须具有相同的列/属性)的每个 OR
  • 每个 AND NOT(必须具有相同的列/属性)由 \(差异)
  • 通过 σ比较进行的每个 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)
    )
    

(有关更多信息,请参阅此答案。)

于 2014-09-22T23:07:12.193 回答
0

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

答案:

π 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'    
}
于 2019-05-03T18:25:56.003 回答
0

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

在此处输入图像描述

本质上,您找到了 Medal 不为空的记录的关系,然后将该记录与其自身连接,并加入名称。结果记录将是有重复名称的记录。

于 2018-04-17T18:15:34.337 回答