SQL示例查询解决方案(按技术分组和子查询技术)

时间:2013-03-10 18:00:03

标签: sql subquery

表:

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)

所以我的问题是,我会从查询中获得所需的结果吗?我真的不明白它是否像答案一样复杂,尤其是当表中没有列时。

班级组中的最小年份应该与该班级的第一艘船相对应。

3 个答案:

答案 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
;