下面是两个带模式的表:
船舶(名称、下水年份、国家、数量、枪械尺寸、排水量)
战斗(船、战名、结果)
典型的ships tuple是:
(“新泽西”,1943,“美国”,9,16,46000)
这意味着“新泽西”号战列舰于1943年下水;它属于美国,携带9门16英寸(口径或枪管内径)的大炮,重量(从航海角度来说,是移位的)46000吨。
一个典型的战斗元组是:
(“胡德”、“北大西洋”、“沉没”)
也就是说,胡德在北大西洋战役中被击沉。其他可能的结果是“正常”和“损坏”。
下面是一个棘手的问题:
对于苏里高海峡战役,对于每一个参与该战役的国家(有一艘或多艘战列舰参与),给出被击沉的战列舰的数量。注意:这个问题很棘手。特别是,你需要处理的(历史)案件,一个国家参与了战斗,但没有任何船只沉没。
到目前为止我试过的。

SELECT country,COUNT(name)
FROM ships RIGHT JOIN battles
      ON ships.name=battles.ship
WHERE battleName='Battle1' AND result='sunk'
GROUP BY country

最佳答案

参加那场战斗的国家(有一艘或多艘战舰
参与)
这意味着至少有一个战名为“苏里高海峡”的战斗记录。意思是INNER JOIN
给出被击沉的战舰数量
这是一个有条件的计数,这里是“诀窍”。你可以使用一个条件结束的总和,然后你可以有沉船的计数。

SELECT country,SUM(CASE WHEN result = 'sunk' THEN 1 ELSE 0 END) AS TotalShipSunk
FROM ships
INNER JOIN battles
      ON ships.name=battles.ship
WHERE battleName='Surigao Strait'
GROUP BY country

09-25 20:56