表:
Classes(class, type, country, numGuns, Bore, displacement)
Ships(name, class, launched)
问题:在每个班级中查找该班级的第一艘船何时启动?
我的尝试:
select class, min(launched) from Ships
group by (class)
提供的答案:
select class, launched from ships as s1
where launched <= ALL (select year from ships as s2
where s2.class = s1.class)
所以我的问题是,我会从查询中获得所需的结果吗?我真的不明白它是否像答案一样复杂,尤其是当表中没有列时。
班级组中的最小年份应该与该班级的第一艘船相对应。
答案 0 :(得分:1)
是的,你的答案有效。
实际上它比提供的答案更好,因为该查询实际上会在类中启动所有发货和启动,这是该类启动的第一年。
答案 1 :(得分:0)
解决此问题的正确方法。
您只是从Ships
表中进行选择,但很可能某些classes
没有在Ships
表中分配任何船只,您需要考虑那些因此使用LEFT JOIN
来遵守条件。
SELECT C.class,
CASE WHEN S.launched IS NULL THEN
(SELECT MIN(launched)
FROM Ships as S
WHERE S.class = C.class) ELSE S.launched END
FROM Classes as C LEFT JOIN Ships as S
ON C.class = S.name;
答案 2 :(得分:0)
select c.class , min (launched)
from classes c left join ships s on c.class = s.class
group by c.class
;