3
A B   C D
1 3   3 3
3 3  

结果显然是,自然加入后

A B C D
1 3 3 3
3 3 3 3

为什么是这样?我认为自然连接需要在这两种情况下具有相似的属性?第一个表中甚至没有 C 或 D 属性,那么它们如何加入?

例如,我们的教授说这两个连接是因为对于第一个结果行,C 是相同的,第二个是相同的。

A B C    C D
1 2 3    3 1
4 5 6    6 2
7 8 9

还是他们只是正常合并?如果那里的第二个表中有 6 2 之后的 2 1,合并将如何出现?

4

3 回答 3

1

交叉连接不需要任何类型的匹配条件 - 集合 A 中的每一行都与集合 B 中的每一行匹配。

其他类型的连接(INNER, OUTER, LEFT, RIGHT)都在一个条件下匹配,因此通常更受限制(即“仅将集合 A 的一行与集合 B 的行连接iff(当且仅当)C集合 A 的列中的值与CSet B") 中的列中的值匹配。

但是,您可以CROSS通过简单地使条件始终为真来使此类连接有效地连接:

SELECT *
FROM SetA
LEFT INNER JOIN SetB
    ON 1 = 1  -- Voila, instant cross join
于 2012-10-19T02:07:10.677 回答
1

在您的第一个示例中,没有要加入的公共字段,因此它只是返回两个表的所有可能组合。

由于您的第二组有一个公共字段,因此结果集将被过滤为:

A B C D
1 2 3 1
4 5 6 2
于 2012-10-19T02:07:26.797 回答
0

如果存在类似的列名,它将合并它们。但是自然连接总是会为每个唯一的列名创建一个列。

关于连接的好信息/示例在这里。 http://www.w3resource.com/sql/joins/

于 2012-10-19T02:12:36.140 回答