【问题标题】:Find youngest in each team in database在数据库中的每个团队中查找最年轻的
【发布时间】:2020-12-07 11:50:24
【问题描述】:

我有一张球员桌和一张球队桌,我正在努力寻找每支球队中最年轻的球员。我能找到最年轻的玩家:

SELECT lname, fname, dob, position
FROM players 
WHERE dob = (SELECT MAX(dob) FROM players);

当我尝试包含团队表时,我收到了与上面相同的数据,这是总体上最年轻的玩家。我对此很陌生,所以我仍在尝试了解多行子查询。如果我按团队名称排序,我将收到相同的输出。团队表是否还需要另一个 SELECT 语句?如果是这样,我该怎么做?将运算符从 IN 更改为 ALL 或 ANY 也会给我相同的输出。

SELECT lname, fname, dob, position, name
FROM players p JOIN teams t ON p.team_id = t.id
WHERE dob IN (SELECT MAX(dob) FROM players);

如果有帮助,我正在使用 LiveSQL。

【问题讨论】:

    标签: sql subquery operators multiple-columns clause


    【解决方案1】:

    您甚至不需要球队表来获取球员信息。一个相关的子查询就足够了:

    SELECT p.lname, p.fname, p.dob, p.position
    FROM players p
    WHERE p.dob = (SELECT MAX(p2.dob)
                   FROM players p2
                   WHERE p2.team_id = p.team_id
                  );
    

    如果您愿意,可以介绍JOIN 来获取团队名称:

    SELECT p.lname, p.fname, p.dob, p.position, t.name
    FROM players p JOIN
         teams t
         ON p.team_id = t.id
    WHERE p.dob = (SELECT MAX(p2.dob)
                   FROM players p2
                   WHERE p2.team_id = p.team_id
                  );
    

    【讨论】:

      【解决方案2】:

      你可以使用NOT EXISTS如下:

      SELECT LNAME, FNAME, DOB, POSITION, NAME
        FROM PLAYERS   P
        JOIN TEAMS     T
      ON P.TEAM_ID = T.ID
       WHERE NOT EXISTS (
          SELECT 1
            FROM PLAYERS P1
          WHERE P1.TEAM_ID = P.TEAM_ID
            AND P1.DOB < P.DOB
      );
      

      【讨论】:

        猜你喜欢
        • 2018-08-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-05
        • 1970-01-01
        相关资源
        最近更新 更多