2013-10-21 67 views
2

说,有以下两个表:SQL到关系代数 - 一个特定的情况下

Table1 (PK1, Attr1) 
Table2 (PK2, Attr1) 

的SQL语句:

SELECT * 
FROM Table1,Table2 

结果

(PK1,Table1.Attr1 ,PK2,Table2.Attr1)。

而且我不明白为什么,因为下面的语义查询:

Table1 x Table2 

和笛卡尔积的定义。

我也想知道关系代数的等价表达式,如果有的话。

这不是家庭作业,我没有成功地抬起头,我事先感谢谁会回答我。

+0

交叉连接将一个表中的所有数据与第二个表中的所有数据相关联。这里的例子只是简单地显示1x1 = 1。如果表1有行a和行b,表2有行c和行d,则会得到4行ac,ad,bc,bd。 (只是我还是这个线程格式化?)。 – Twelfth

+0

对不起,我没有解释清楚。我只写了表格属性的名称:PK1,Attr1和PK2是“列” – user2302585

+0

我忘了谢谢你的回复。 – user2302585

回答

1

“的SQL语句: SELECT * FROM 表1,表2

结果

(PK1,Table1.Attr1,PK2,Table2.Attr1)”

不正确。这SQL语句的结果[与标题表]

(PK1,ATTR1,PK2,ATTR1)

注意区别小心。在SQL中,那些点限定符以及它们之前的内容是不是结果中属性/列名称的一部分。它们是所谓的范围变量的名称,并且这些变量仅在其出现的SELECT语句内存在。一旦SELECT语句被“终止”,那些范围变量消失。您可以通过尝试来验证/验证

SELECT Table1.Attr1 FROM(your join here);

任何符合标准的引擎都会引发错误。有些引擎可能会接受这些东西,因为作者认为这样做是适当的,但是您应该认识到,您不能指望任何随机引擎的行为如此。

您也可以尝试

SELECT Attr1 FROM(your join here);

但现在每个引擎都应该抱怨模棱两可的列引用。

所以我们回来:该SQL语句的结果[与标题表]

(PK1,ATTR1,PK2,attR1位)。

这绝对不是一个关系,因此没有可能产生这个东西的关系代数的操作,因此根本就不存在任何等价于你的SQL操作的关系代数公式。

+0

这就是我一直在寻找的。非常感谢你! – user2302585