在SQL中自然连接

时间:2014-03-09 14:23:39

标签: sql

表:

Ships (shipName, shipType, launchDate)
Battles (battleName, battleDate)
Outcomes (shipName, battleName, result)

编写一个SQL查询,返回在海战中损坏的船只的名称,后来又参与了另一种类型。

答案:

 select 
     o1.shipName
 from 
     (Battles b1 natural join Outcomes o1)
 natural join
    (Battles b2 natural join Outcomes o2)
 where 
    o1.result = ’damaged’
    and b2.battleDate > b1.battleDate;

可以解释为什么这个答案有效吗?

当我们进行自然连接时,我们加入具有相同名称的属性?

战斗b1自然联合结果o1在这一项中,两者的唯一共同点是battleName。

但是(Battles b1 natural join Outcomes o1)

natural join
(Battles b2 natural join Outcomes o2) 

所有属性都是常见的,现在如何自然加入?

2 个答案:

答案 0 :(得分:0)

当您具有相同名称的列时,自然联接可以正常工作。你可以使用自然连接和join..using - 是这样的。在你的示例列“battleName”非常适合这个

答案 1 :(得分:0)

NATURAL JOIN包括考虑其常用列名的连接表。 MySQL documentation以这种方式解释了它:

  

两个表的NATURAL [LEFT] JOIN被定义为语义   相当于INNER JOIN或带有USING子句的LEFT JOIN   命名两个表中存在的所有列。

查询有效,因为在Battles b1Outcomes o1之间使用NATURAL JOIN,有公共列battleName,否则,没有任何公共列,您将无法获得任何有用的结果(意外的结果)。 看看这个SQL Fiddle

  

但是(战斗b1自然加入Outcomes o1)自然加入(战斗b2   自然联合结果o2)alla的属性是常见的   自然加入现在的工作?

NATURAL JOIN的工作原理与第一个NATURAL JOIN完全相同,它考虑了常见的列。查询显示将两个表连接在一起的结果不止一次,以考虑相应行的不同战斗日期。