计算行数的关系代数

Out*_*ack 6 relational-algebra relational-database

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

Competition(compId, sport, playerName, medal)
Run Code Online (Sandbox Code Playgroud)

假设属性勋章可以是金、银、铜或空。所以我们有以下数据:

(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)
Run Code Online (Sandbox Code Playgroud)

我很难弄清楚如何回答这个问题:获取所有获得超过一枚奖牌的球员的姓名。在此数据中,答案将是 John Doe 和 Mary White。我怎么能用关系代数得到这个关系的任意数据的答案?

(这是实际作业问题的简化版本,这种简化代表(我希望)我正在努力解决的问题的一部分。比赛、运动和球员的数量是任意且未知的,但只有 4 种可能性奖牌)

phi*_*pxy 2

\n

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

\n
\n\n

(不清楚这意味着什么。赢得了不止一种奖牌?或者已经获得了不止一种奖牌?您的示例答案表明是后者。此外,它将“null”视为另一种奖牌,而不是特别就像 SQL 中一样。)

\n\n
-- rows where\n    THERE EXISTS compId,sport,medal,compId1,compId2,medal2 SUCH THAT\n        in competition [compId] of sport [sport] player [playerName] won [medal]\n    AND in competition [compId2] of sport [sport2] player [playerName] won [medal2]\n    AND (compId <> compId2 OR sport <> sport2 OR medal <> medal2)\n
Run Code Online (Sandbox Code Playgroud)\n\n

使用语句简写:

\n\n
-- rows where\n    THERE EXISTS compId,sport,medal,compId1,compId2,medal2 SUCH THAT\n        Competition(compId, sport, playerName, medal)\n    AND Competition(compId2, sport2, playerName, medal2)\n    AND (compId <> compId2 OR sport <> sport2 OR medal <> medal2)\n
Run Code Online (Sandbox Code Playgroud)\n\n

重新排列(预计每个 \xcf\x83 一次比较和每个 \xe2\x88\xaa 一个属性集的限制):

\n\n
-- rows where\n    THERE EXISTS compId,sport,medal,compId1,compId2,medal2 SUCH THAT\n        (   Competition(compId, sport, playerName, medal)\n        AND Competition(compId2, sport2, playerName, medal2)\n        AND compId <> compId2)\n    OR (   Competition(compId, sport, playerName, medal)\n        AND Competition(compId2, sport2, playerName, medal2)\n        AND sport <> sport2)\n    OR (   Competition(compId, sport, playerName, medal)\n        AND Competition(compId2, sport2, playerName, medal2)\n        AND medal <> medal2)\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在将代数替换为:

\n\n
    \n
  • 每个语句按其表/关系
  • \n
  • 表/关系的每个 AND 由 \xe2\x8b\x88 (自然连接)
  • \n
  • 表/关系的每个 OR(必须具有相同的列/属性)由 \xe2\x88\xaa (联合)
  • \n
  • every AND NOT(必须具有相同的列/属性)by \\(差异)
  • \n
  • 通过 \xcf\x83比较进行每个 AND比较(选择/限制)
  • \n
  • 每个 EXISTS名称都由 \xcf\x80名称删除(投影)
  • \n
  • 每个列/属性都通过 \xcf\x81 重命名(重命名)。

    \n\n
    \xcf\x80 playerName (\n    \xcf\x83 compId <> compId2 (Competition\n        \xe2\x8b\x88 \xcf\x81 compID2/compID \xcf\x81 sport2/sport \xcf\x81 medal2/medal Competition)\n\xe2\x88\xaa   \xcf\x83 sport <> sport2 (Competition\n        \xe2\x8b\x88 \xcf\x81 compID2/compID \xcf\x81 sport2/sport \xcf\x81 medal2/medal Competition)\n\xe2\x88\xaa   \xcf\x83 medal <> medal2 (Competition\n        \xe2\x8b\x88 \xcf\x81 compID2/compID \xcf\x81 sport2/sport \xcf\x81 medal2/medal Competition)\n)\n
    Run Code Online (Sandbox Code Playgroud)
  • \n
\n\n

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

\n