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

问题描述 投票:1回答:2

我对此感到非常困惑。我搜索了很多教程,但找不到清晰的答案。

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感到困惑。同一列似乎会出现两次?

relational-algebra cartesian-product
2个回答
1
投票

某些关系查询语言/代数关系具有有序列名。有一种通过列号引用列的方法。因此,属性名称可以命名多个列。笛卡尔乘积运算符可以采用任意两个关系,因为属性名称在输出(或输入)上出现多次不成问题。

某些关系查询语言/代数笛卡尔乘积运算符在输出上更改属性名称。输入关系具有名称。 (输入是关系变量/常量或关系值的以太名称,以及它们的名称。)每个输出列名称是输入列名称和输入关系名称的组合。笛卡尔乘积运算符可以取任意两个关系。因为在输入时以相同的属性名称出现在不同关系中的列将通过输出中的输入关系名称来区分。

某些关系查询语言/代数兼有。笛卡尔乘积运算符可以取任意两个关系。

某些关系查询语言/代数关系只有属性名称的一个副本。因此,仅当输入不共享任何属性名称时才可以调用笛卡尔积。 (这只是NATURAL JOIN和/或EQUIJOIN的特例。)

因此,您必须密切注意关系查询语言/代数的关系和运算符中的种类

PS:SQL查询语言

SELECT表达式的FROM子句为其表构成临时笛卡尔积。每个列名称都是输入列名称,该输入列名称以给定的表名称或表别名加上一个点作为前缀。这是上述笛卡尔积的更改名称版本。虚线名称用于SELECT表达式的其余部分。 SELECT clause最终删除前缀和点。因此,在SELECT表达式之外的SQL表值中没有点。 (这些列也是有序的,并且可以有重复的列名。)

如果您的SQL表表达式为ABBD,则只需要

SELECT * FROM AB ab CROSS JOIN BD bd

1
投票

您只需要以下内容;

SELECT * FROM TAbleA CROSS JOIN TableB

© www.soinside.com 2019 - 2024. All rights reserved.