2014-08-30 32 views
0

这是我使用的数据库为我查询为什么我得到所有的比萨饼(关系代数)和我的连接搞乱了?

https://class.stanford.edu/c4x/DB/RA/asset/pizzadata.html

用于写出关系代数的查询语法是基于关闭http://www.cs.duke.edu/~junyang/ra/

我的查询是“查找至少有一名20岁以上的女性吃过的所有匹萨”。 这是我迄今为止

\project_{name,pizza}(
Person \join_{gender='female' and age>20} Eats 
) 

我想我有权利逻辑在这里。(“\ join_ {COND}是关系THETA联接运算符”。)我还显示名称列调试目的。我加入两个关系,只保留性别为女性且年龄大于20的行。

我的查询结果(与正确的查询相反)。我不认为这是一个语法问题。在Eats关系中,Fay只吃蘑菇。我不明白为什么她与每一个比萨饼组合

enter image description here

回答

2

西塔加入配对是直角;他们将每个表的每一行与每个其他表的每一行相连接。在你的例子中,你加入Person的每一行,其中gender='female' and age>20Eats的每一行无关,而不管name。您可能想要:

Person \join_{gender='female' and age>20 and name=eater} \rename{eater, pizza} Eats 

请注意,Thetas通常会增加行数;您通常会减少使用Sigmas或选择返回的行数。执行语句的更习惯的方式是使用选择和自然连接:

\select{gender='female' and age>20} Person \join Eats 
+0

不自然连接一般只是在属性相等的地方连接表?就像这两个关系都有名字一样,那为连接选择的属性是什么? – committedandroider 2014-08-31 01:20:06

+0

那么我做错了什么,我只指定第一个表的条件? – committedandroider 2014-08-31 01:22:40

+0

事实上,自然连接只包含同名命名属性相等的关系。但是你没有使用自然连接,你使用了Theta连接。我添加了一个使用自然连接的示例。 – 2014-08-31 01:23:04

相关问题