1

我有一张名为 Product 的表。我需要选择所有具有 MAX ManufatureDate 的产品记录。

这是表数据的示例:

Id  ProductName     ManufactureDate
1   Car             01-01-2015
2   Truck           05-01-2015
3   Computer        05-01-2015
4   Phone           02-01-2015
5   Chair           03-01-2015

这是结果应该是什么,因为所有记录的最大日期是 05-01-2015 并且这 2 条记录具有这个最大日期:

Id  ProductName     ManufactureDate
2   Truck           05-01-2015
3   Computer        05-01-2015

我能想到的唯一方法是首先对整个表进行查询以找出最大日期是什么,然后将其存储在变量@MaxManufatureDate 中。然后在 ManufactureDate=@MaxManufactureDate 处进行第二次查询。有人告诉我有更好的方法。

此表中有 100 万条以上记录:

这是我目前的做法:

@MaxManufactureDate = select max(ManufactureDate) from Product
select * from Product where ManufactureDate = @MaxManufactureDate

如果图这比在 where 子句中进行子选择要好得多。还是这与在 where 子句中执行子选择完全相同?我不确定查询是否会针对每一行运行,无论 sqlserver 是否将变量值存储在内存中。

4

3 回答 3

4
select * from product
where manufactureDate = (select max(manufactureDate) from product)

内部选择语句选择最大日期,外部所有具有日期的产品。

于 2015-09-23T19:17:58.890 回答
0

您可以使用子查询

 SELECT * 
 FROM Product 
 WHERE ManufactureDate = (
   SELECT ManufactureDate 
   FROM Product 
   ORDER BY ManufactureDate 
   LIMIT 1
 );`

您可能需要使用ASCDESC收集正确的订单

于 2015-09-23T19:18:49.570 回答
0

试试这个模式:

SELECT Id, ProductName, ManufactureDate
FROM (
    SELECT Id, ProductName, ManufactureDate, MAX(ManufactureDate)OVER() AS MaxManufactureDate
    FROM Product P
    ) P
WHERE P.MaxManufactureDate = P.ManufactureDate

本质上,使用窗口函数在内联视图中获取您要查找的数据,然后使用外部查询中的 where 子句来匹配它们。

于 2015-09-23T19:19:11.773 回答