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

Posted

技术标签:

【中文标题】SQL 示例查询解决方案(按技术分组和子查询技术)【英文标题】:SQL Sample Query solutions (group by technique and the sub-query technique) 【发布时间】:2013-03-10 18:00:02 【问题描述】:

表格:

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)

所以我的问题是,我会从我的查询中得到想要的结果吗?我真的不明白它是否像提供的答案那么复杂,尤其是当表中没有年份这样的列时。

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

【问题讨论】:

【参考方案1】:

是的,你的答案有效。

事实上,它比提供的答案更好,因为该查询实际上返回了该类推出的第一年的所有船只和发射。

【讨论】:

【参考方案2】:

这个问题的正确解决方案。

您只是从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;

【讨论】:

【参考方案3】:
select c.class , min (launched)
from classes c left join ships s on c.class = s.class 
group by c.class
;

【讨论】:

请尽量在您的解释中更具描述性。 这是问题的解决方案 仅代码的答案被认为是低质量的:请务必说明您的代码的作用以及它如何解决问题。如果您可以在帖子中添加更多信息,它将帮助提问者和未来的读者。另请参阅Explaining entirely code-based answers。

以上是关于SQL 示例查询解决方案(按技术分组和子查询技术)的主要内容,如果未能解决你的问题,请参考以下文章

sql中如何按某字段值的首字母分组?

SQL关联查询 直接join 和子查询的区别

将查询分组为组和子组

Oracle sql查询按日期对连续记录进行分组

oracle sql查询求助

mssql 2005查询 请问我要实现分组获取最大值,怎么写sql查询指令