我有两个关系,emp(id,name)
和emp2(name,city,salary)
,其值为:
正如你所看到的,当我在它们之间运行自然连接时,我得到它们的笛卡尔积。
但是为什么,因为它们有一个共同的属性(name
)?
答案 0 :(得分:1)
你 获得自然加入,而不是笛卡尔积。
每个公共列都有一个副本,每个列的一个副本对输入表是唯一的。左输入表中的行与右输入表中的行的每个不同组合都有一行。
如果公共列(('kim')
)的子行值(name
)在左表中出现n次(2次),在右表中出现m次(2次),则会出现在输出中n次m次(2次2次= 4次)。
SQL Cartesian产品将包含name
,city
,salary
,id
&列; name
并且对于左输入表中的行和来自右输入表的行的每个不同组合都会有一行。
包括左表和右表中name
值的所有可能组合。但对于此示例数据,两个表中只有一个 name
值,因此每对名称值必须具有该值两次。
自然连接与笛卡尔积相同,然后限制公共列的相等性,然后抛出每个公共列中的一个,然后保留不同的行。
答案 1 :(得分:0)
您在公共列(名称)中有两次相同的值,因此这会使行返回更多时间。 您的自然连接基于每行都没有唯一值的表。 然后在这种情况下,每个条目(也使用内部联接)总是会得到更多的行,但是您可以使用不同的
来解决select dictinct emp.*, emp2.*
from emp
inner join emp2 on emp.name = emp2.name
或
select select dictinct emp.*, emp2.*
from emp2 natural join emp
答案 2 :(得分:0)
在emp.id = emp2.id
上从emp内联接emp2中选择*