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 示例查询解决方案(按技术分组和子查询技术)的主要内容,如果未能解决你的问题,请参考以下文章