-1

我有两个关系,emp(id,name)并且emp2(name,city,salary)有价值观:

在此处输入图像描述

和关系 emp2 值: 在此处输入图像描述

如您所见,当我在它们之间运行自然连接时,我得到了他们的笛卡尔积。但是为什么,因为它们有一个共同的属性(name)?

4

3 回答 3

1

得到的是自然加入,而不是笛卡尔积。

每个公共列都有一个副本,每个输入表唯一的列都有一个副本。左输入表中的一行和右输入表中的一行的每种不同组合都有一行。

如果('kim')公共列 ( name) 的子行值 ( ) 在左表中出现 n 次(2 次),在右表中出现 m 次(2 次),那么它将在输出中出现 n 次 m 次(2 次 2 次 = 4次)。

SQL 笛卡尔积将具有列namecitysalaryid& name,并且对于左输入表中的一行和右输入表中的一行的每种不同组合都有一行。

name这包括左表和右表中值的所有可能组合。但是对于这个示例数据,两个表中只有一个 name值,因此每对名称值都必须具有该值两次。

自然连接与笛卡尔积相同,然后限制公共列的相等性,然后投影每个公共列之一,然后保持不同的行。

于 2017-09-30T04:52:50.083 回答
0

select * from emp inner join emp2 on emp.id = emp2.​​id

于 2017-09-29T07:44:09.663 回答
0

您在公共列(名称)中有两次相同的值,因此这会更长时间地检索行。您的自然联接基于每行都没有唯一值的表。然后在这种情况下,每个条目(也有内部连接)总是多于一行,但您可以使用 distinct 来解决

select dictinct emp.*, emp2.* 
from emp 
inner join emp2 on emp.name = emp2.name 

或者

select select dictinct emp.*, emp2.* 
from emp2 natural join emp
于 2017-09-29T07:04:28.393 回答