我的问题有问题,我不知道是什么问题?

x6492ojm  于 2022-09-18  发布在  Java
关注(0)|答案(3)|浏览(265)

这就是问题陈述:找出在战斗中失去所有舰船的国家。

数据库描述是: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
;

我的结果是日本德国和零正确的结果应该只有德国

kokeuurv

kokeuurv1#

似乎诀窍是将and not exists (select 0 from ships where name = o.ship)添加到原始查询中,不包括Ships表中不存在的船舶,当然,Country列的值不应该为空,因为会询问相关国家。因此,请考虑使用:

select country
  from Classes c
  left join Ships s
    on c.class = s.class 
 right join Outcomes o
    on c.class = ship
   and not exists (select 0 from ships where name = o.ship)
   and o.result = 'sunk'
 where c.country is not null
 group by country;
  • 顺便说一句,使用ship in (select ship from outcomes where result = 'sunk')是多余的,and o.result = 'sunk'就足够了。*
r1zk6ea1

r1zk6ea12#

我会使用having子句:

select c.country
from classes c join
     Ships s
     on c.class = s.class left join
     outcomes o
     on o.ship = s.name
group by c.country
having count(distinct s.name) = count(distinct case when o.result = 'sunk' then s.name end);
ahy6op9u

ahy6op9u3#

我比较了每个国家的船只和每个国家沉没的船只,我对它们进行了过滤,只显示了两个表中计数相同的国家

WITH ALL_SHIPS AS (
 SELECT ship, country from outcomes o
 JOIN classes c ON (c.class = o.ship)
 UNION
 SELECT name, country FROM ships s
 JOIN classes c ON (c.class = s.class)
),
SHIPS_PER_COUNTRY AS (
 SELECT country, COUNT(ship) count FROM ALL_SHIPS
 GROUP BY country
),
SHIPS_SUNK AS (
 SELECT ship, result FROM outcomes
 WHERE result = 'sunk'
),
SHIPS_SUNKED_PER_COUNTRY AS (
 SELECT aships.country, COUNT(ssunk.result) count FROM ALL_SHIPS aships
 JOIN SHIPS_SUNK ssunk ON (ssunk.ship = aships.ship)
 GROUP BY aships.country
)
SELECT spc.country FROM SHIPS_PER_COUNTRY spc
JOIN SHIPS_SUNKED_PER_COUNTRY sspc ON (sspc.country = spc.country)
WHERE spc.count = sspc.count

相关问题