我对此真的很困惑。我搜索了很多教程,但找不到明确的答案。
A B B D
1 X x 5
2 x y 6
x 4
我想交叉这两个表。A,B,B,d是属性。
A B B D
1 X x 5
2 x x 5
1 X y 6
2 x y 6
1 X x 4
2 x x 4
根据笛卡尔规则,这应该是正常的答案。交叉所有行。但我对同一列 B 感到困惑。同一列会出现两次?
最佳答案
一些关系查询语言/代数关系具有有序列名称。因此,一个属性名称可以命名多个列。 (应该有一种方法按列号引用列。)笛卡尔积运算符可以采用任意两个关系,因为属性名称在输出(或输入)上多次出现不是问题。
一些关系查询语言/代数笛卡尔积运算符更改输出上的属性名称。输入关系具有关联的名称。 (输入包含关系变量/常量的名称,或者关系值包含名称。)每个输出列名称都是输入列名称和输入关系名称的组合。笛卡尔积运算符可以取任意两个关系。因为输入上具有相同属性名称的不同关系中出现的列将通过输出上的输入关系名称来区分。
一些关系查询语言/代数两者都有。笛卡尔积运算符可以取任意两个关系。
某些关系查询语言/代数关系只有一个属性名称副本。因此,只有当输入不共享任何属性名称时才能调用笛卡尔积。 (这只是 NATURAL JOIN 和/或 EQUIJOIN 的特例。)如果您的输入共享列名称,并且您希望每个输入列都有一列输出,那么您需要重命名列,以便在加入之前所有列都不同。
因此,您必须密切关注关系查询语言/代数的关系和运算符的种类。
PS:SQL查询语言
SELECT 表达式的 FROM 子句生成其表的临时笛卡尔积。每个列名都是一个输入列名,前缀为给定的表名或表别名,再加上一个点。这是上面笛卡尔积的更改名称版本。点名称用于 SELECT 表达式的其余部分。 SELECT 子句最终删除了前缀和点。因此,在 SELECT 表达式之外的 SQL 表值中没有点。 (列也是有序的,并且可以有重复的列名。)
如果您的 SQL 表表达式是 AB 和 BD 那么您只需要
SELECT * FROM AB ab CROSS JOIN BD bd
关于relational-algebra - 包含相同列的表的笛卡尔积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33942237/