这就是问题陈述:找出在战斗中失去所有舰船的国家。
数据库描述是:enter image description here简短的数据库描述“Ships”
参加第二次世界大战的海军舰艇数据库正在考虑之中。数据库由以下关系组成:
Classes(class, type, country, numGuns, bore, displacement)
Ships(name, class, launched)
Battles(name, date)
Outcomes(ship, battle, result)
所有级别的船都有相同的总体设计。类通常被分配根据相应设计建造的第一艘船的名称,或者与数据库中的任何船名称不同的名称。其名称被分配给某一类别的船被称为领头船。
类别关系包括类别名称、类型(对于战舰可以是BB,对于战斗巡洋舰可以是BC)、建造舰艇的国家、主炮的数量、火炮口径(以英寸为单位)和排水量(以吨为单位)。
Ships关系包含有关船名、其对应类的名称以及船下水年份的信息。
战斗关系包含舰艇参与的战斗的名称和日期。
结果关系-给定船只的战斗结果(可能是沉没、损坏或OK,最后一个值表示该船在战斗中安然无恙)。
备注:
1.结果关系可以包含船舶关系中不存在的船舶。
1.沉船不能参加以后的战斗。
1.由于历史原因,在许多演习中,领头船被称为领头舰。
1.在结果表中找到但未在船舶表中找到的船舶仍被视为数据库中的船舶。即使它沉没了,这也是真的。
这是我的代码:
select country
from Classes left join Ships
on classes.class=ships.class
right join Outcomes
on Classes.class=ship
or ships.name=ship
where ship in (select ship from outcomes where result = 'sunk')
group by country
;
我的结果是日本德国和零正确的结果应该只有德国
3条答案
按热度按时间kokeuurv1#
似乎诀窍是将
and not exists (select 0 from ships where name = o.ship)
添加到原始查询中,不包括Ships表中不存在的船舶,当然,Country列的值不应该为空,因为会询问相关国家。因此,请考虑使用:ship in (select ship from outcomes where result = 'sunk')
是多余的,and o.result = 'sunk'
就足够了。*r1zk6ea12#
我会使用
having
子句:ahy6op9u3#
我比较了每个国家的船只和每个国家沉没的船只,我对它们进行了过滤,只显示了两个表中计数相同的国家