【问题标题】:SQL Sample Query solutions (group by technique and the sub-query technique)SQL 示例查询解决方案(按技术分组和子查询技术)
【发布时间】: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)

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

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

【问题讨论】:

    标签: sql subquery


    【解决方案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