带连接的SQL多选

时间:2014-03-11 14:27:23

标签: sql select join left-join

我可以找到我的一个sql语句的解决方案,我想请求你的帮助;)

让我们想象一下,我们有运动员的表,他们必须跑100米远的距离。 每次运行后,每次运行都会运行Run,Name和Time:

Run Name  Time[s]
1   Joe     10
2   Joe     11
1   Jim     14
2   Jim     12

我想要做的是选择Run,Name和最快的时间,所以在这种情况下它将是min(Time)。 但是当我使用Min聚合函数时,我必须按所有其他参数进行分组,因此它将返回所有记录...

我试过这个。但它不起作用:

SELECT MIN(Time) AS MinTime, Name AS TimeName
        From Athletes
        group by TimeName
        LEFT JOIN  
        (Select Run, Name, Time From Athletes a)
         On 
         a.Name = TimeName, a.Time = MinTime; 

是的,它有语法错误,但它不是主要问题,因为我不知道它仍然无法正常工作。

提前谢谢, SQL新手

5 个答案:

答案 0 :(得分:4)

您的SQL查询到处都是您有一个不必要的联接,而您的group by位置错误,left join语法也不正确。我废弃它并重新编写它以正确使用min()

SELECT run, MIN(Time) AS MinTime,
Name AS Timename
From Athletes
group by TimeName

无需在同一个表上运行join,如果您知道group by需要哪些列,则也不需要where子句。

在sqlfiddle上测试并使用。 http://sqlfiddle.com/#!2/13b1a/2

我建议你仔细阅读group by做了什么以及如何正确地join表。

随着表的增长,如果您没有使用任何类型的id或密钥,您可以使用实际涉及子查询的更高级查询:

select a.run,
a1.name,
a1.Time
from athletes as a
    ,(select name,
    min(time) as Time
    from athletes
    group by name) as a1
where a.time = a1.Time
and a.name = a1.name

仍然没有理由使用join,子查询路由是您当前数据集和架构的合适路径。 http://sqlfiddle.com/#!2/23cb4/23

答案 1 :(得分:0)

select Run , Name, Time from Athletes a
where Time=(select min(time) 
      from Athletes s 
      where s.Name=a.Name)

答案 2 :(得分:0)

SELECT * 
FROM Athletes a
WHERE a.Time = (select min(time) from Athletes a2 where a2.Name = a.Name)

以下是SqlFiddle

上的示例用法

答案 3 :(得分:0)

尝试此查询:

SELECT r.Run, r.Name, r.Time 
FROM (SELECT * FROM Athletes ORDER BY Time) r 
GROUP BY r.Name

答案 4 :(得分:-1)

我看到left-join是您提问的标签之一,但没有它就可以完成。

SELECT *
FROM Athletes a
WHERE a.Time = ( SELECT MIN(a2.Time) FROM Athletes a2 )

请注意,如果有两个或更多的参赛者并列最快时间,您可能会从查询中获得多个结果。希望这会有所帮助。

以下是获取相同信息的查询,按运动员名称分组:

SELECT a.*
FROM #Athletes a
JOIN ( SELECT a2.Name, MIN(a2.Time) Time FROM #Athletes a2  GROUP BY a2.Name) BestTimes
ON a.Name = BestTimes.Name
AND a.Time = BestTimes.Time