relational-algebra - 包含相同列的表的笛卡尔积

标签 relational-algebra cartesian-product

我对此真的很困惑。我搜索了很多教程,但找不到明确的答案。

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 表表达式是 ABBD 那么您只需要

SELECT * FROM AB ab CROSS JOIN BD bd

关于relational-algebra - 包含相同列的表的笛卡尔积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33942237/

相关文章:

mysql - 请求帮助将 SQL 查询转换为关系代数

mysql - 关系代数银行数据库

ruby-on-rails - 如何使用 arel/关系代数和 has_many :through 获取不同的值

java - 通过Java Stream实现多个集合的笛卡尔积

sql - 关系数据库的最新进展是什么?

collections - 与 Groovy 集合的反连接

python - Python 中单个列表上的 n 折笛卡尔积

java - Java中n个子数组的取值组合

makefile - 如何在Makefile中获取名称列表的笛卡尔积(组合扩展)

ruby - 数组的笛卡尔乘积本身在 Ruby 中没有重复项