包含相同列的表的笛卡尔积

Cartesian products of tables that contains same columns

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

A  B        B  D
1  X        x  5
2  x        y  6
            x  4

我要交叉这两个 tables.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 感到困惑。同一列会出现两次?

难道你只需要以下这些;

SELECT * FROM TAbleA CROSS JOIN TableB

?

一些关系查询 language/algebra 关系具有 有序的列名 。有一种方法可以按列号引用列。所以一个属性名可以命名多个列。笛卡尔积运算符可以采用任意两个关系,因为属性名称在输出(或输入)中出现多次不是问题。

一些关系查询language/algebra 笛卡尔积运算符更改输出的属性名称。输入关系有名称。 (输入是关系 variables/constants 的以太名称或它们的关系值和名称。)每个输出列名称是输入列名称和输入关系名称的组合。笛卡尔乘积运算符可以取任意两个关系。因为在输入时出现在具有相同属性名称的不同关系中的列将在输出时通过输入关系名称来区分。

一些关系查询 languages/algebras 两者都有。笛卡尔乘积运算符可以取任意两个关系。

某些关系查询 language/algebra 关系 只有一个属性名称副本 。因此笛卡尔积只能在输入不共享任何属性名称时调用。 (这只是 NATURAL JOIN and/or EQUIJOIN 的特例。)

因此,您必须密切关注关系查询 language/algebra 的 种类 运算符

PS:SQL查询语言

SELECT 表达式的 FROM 子句生成其 table 的 临时笛卡尔积。每个列名都是一个输入列名,前缀为给定的 table 名称或 table 别名,再加上一个点。这是上面笛卡尔积的改名版本。带点的名称用于 SELECT 表达式的其余部分。 SELECT 子句 最后去掉了前缀和点。因此 SQL table 值在 SELECT 表达式之外没有点。 (列也是有序的,列名可以重复。)

如果你的 SQL table 表达式是 AB & BD 那么你只需要

SELECT * FROM AB ab CROSS JOIN BD bd