表:
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)
所有属性都是常见的,现在如何自然加入?
答案 0 :(得分:0)
当您具有相同名称的列时,自然联接可以正常工作。你可以使用自然连接和join..using - 是这样的。在你的示例列“battleName”非常适合这个
答案 1 :(得分:0)
NATURAL JOIN包括考虑其常用列名的连接表。 MySQL documentation以这种方式解释了它:
两个表的NATURAL [LEFT] JOIN被定义为语义 相当于INNER JOIN或带有USING子句的LEFT JOIN 命名两个表中存在的所有列。
查询有效,因为在Battles b1
和Outcomes o1
之间使用NATURAL JOIN,有公共列battleName
,否则,没有任何公共列,您将无法获得任何有用的结果(意外的结果)。
看看这个SQL Fiddle。
但是(战斗b1自然加入Outcomes o1)自然加入(战斗b2 自然联合结果o2)alla的属性是常见的 自然加入现在的工作?
NATURAL JOIN的工作原理与第一个NATURAL JOIN完全相同,它考虑了常见的列。查询显示将两个表连接在一起的结果不止一次,以考虑相应行的不同战斗日期。