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