Sql 如何优化使用多个子select语句的查询

Sql 如何优化使用多个子select语句的查询,sql,performance,max,Sql,Performance,Max,希望有人能帮我解决这个问题: 我的桌子是: id Version datetime name resource ---|--------|------------|--------|--------- 1 | 1 | 03/03/2009 | con1 | 399 2 | 2 | 03/03/2009 | con1 | 244 3 | 3 | 01/03/2009 | con1 | 555 4 | 1 |

希望有人能帮我解决这个问题: 我的桌子是:

id  Version  datetime     name     resource 
---|--------|------------|--------|--------- 
1  | 1      | 03/03/2009 | con1   | 399  
2  | 2      | 03/03/2009 | con1   | 244 
3  | 3      | 01/03/2009 | con1   | 555 
4  | 1      | 03/03/2009 | con2   | 200 
5  | 2      | 03/03/2009 | con2   | 500 
6  | 3      | 04/03/2009 | con2   | 600 
7  | 4      | 31/03/2009 | con2   | 700 
我需要选择datetime最大值小于或等于给定日期的每个不同名称;如果有多条记录满足第一个条件,则版本为最大版本

如果给定日期为'04/03/2009',则结果为:

id  Version  datetime     name     resource 
---|--------|------------|--------|--------- 
2  | 2      | 03/03/2009 | con1   | 244  
6  | 3      | 04/03/2009 | con2   | 600 
目前,我已经创建了以下查询,它可以正常工作,但我怀疑它在大型表上运行时的性能不是最好的:

SELECT [id], [Version], [datetime], [name], [resource]  
FROM theTable
WHERE [Version] = 
(
SELECT MAX(Version) FROM theTable AS theTable2 WHERE theTable.[name] = theTable2.[name] 
AND  theTable2.[datetime] = 
    (
    SELECT MAX(theTable3.[datetime]) FROM theTable AS theTable3 
    WHERE theTable2.[name] = theTable3.[name] AND theTable3.[datetime] <= '04/03/2009'
    )
)
如果有人能提出更有效的方法,我将不胜感激;如果可能,请提供一个示例:-


提前感谢。

您可以按使用分区。这使您可以对结果进行基本排序。在您的实例中,您希望只选择排名为1的结果。首先,使用WHERE筛选出具有无效日期时间的结果,然后在分区中按列降序排列。因此,第一个结果将是具有最大日期时间的结果,如果是datetime tie,则也是具有最大版本的结果

SELECT [id], [Version], [datetime], [name], [resource]
FROM
(
   SELECT [id], [Version], [datetime], [name], [resource], row_number() 
     OVER (PARTITION BY [name] ORDER BY [datetime] DESC, [Version] DESC) as groupIndex
   FROM theTable
   WHERE [datetime] <= '04/03/2009'
) AS t
WHERE groupIndex = 1

谢谢@Brisbe42,这无疑更具表现力,更具可读性。以后我将更多地使用这种语法。注意,编译前需要别名,即选择。。。从…起作为T,其中groupIndex=1