用于SQL查询的关系代数和域关系演算



>Tables:

Contest(starter, ender, pointsStarter, pointsEnder, debatedate)
Debater(name, club, age)

查询:

提供首发辩手所属的比赛的所有比赛详情 的"柏拉图"俱乐部,并阻止他的对手得分。

我写过的 SQL:

SELECT starter, pointsStarter, ender, pointsEnder, debatedate
FROM contest
WHERE pointsEnder = 0
AND starter IN (SELECT name FROM debater WHERE club = 'Plato')

我写过的关系代数:

Π starter,ender,pointsStarter,pointsEnder,debatedate (
Ϭ Contest.pointsEnder=0 (
Ϭ club=”Plato” (Contest Debater)))

域关系演算我写过:

{< starter,ender,pointsStarter,pointsEnder,debatedate> | 
Ǝ < starter,ender,pointsStarter,pointsEnder,debatedate > ϵ Contest (
Ǝ < name,club,age > ϵ Debater (
^ pointsEnder=0 ^ club=”Plato”))
}

明显的错别字:在你的微积分中,在pointsEnder之前有一个错误的^。你大概打算在你的代数中加入ContestDebater

你还没有给出你要使用的代数和微积分版本的参考。因此,我们只能猜测修正的可能性质。你不太可能需要Contest..

请注意,你的代数和微积分并没有等同于starter和name。如果您的加入是自然的,则需要将name重命名为starterDebater。你最内在的微积分需要一个额外的连词来等同它们。

您不希望通过以下方式删除结果列:

Π starter,ender,pointsStarter,pointsEnder,debatedate (...)

您希望删除非结果列。如果您的加入是自然的,那就是:

Π club, age (...)

同样,微积分查询的结果列必须在右侧表达式中显示为自由(未由 Ǝ 量化)。所以代替:

Ǝ < ... > ϵ Contest (...)

你需要这样的东西:

Ǝ < s,e,ps,pe,dd > ϵ Contest (
s=starter ^ e=ender ^ ps=pointsStarter ^ pe=pointsEnder ^ dd=debatedate
^   ...)

最新更新