2013-01-22 86 views
1

我有2个相当简单的查询,我需要做一个。我今天只是有一个精神空白。如何使2 SQL查询1

SELECT max(StatusReportID) 
    FROM dbo_VehicleStatusReport 

SELECT StatusReportID, StatusReportTime, CarNumber, VehicleID, 
     DriverNumber, DriverID, VehicleStatus, LocationX, LocationY, 
     Speed, Direction, InvalidGPS 
    FROM dbo_VehicleStatusReport 
WHERE StatusReportID > " & MaxStatusReportID2 & " 

其中& MaxStatusReportID2 &是从第一个查询减去3000(-3000)

+0

基本上是什么下面,扔我的位是 - 3000 – Mike

+1

你能解释3000有什么相关性吗? –

+0

就像'找到最新的2999状态报告'一样吗? – Nat

回答

4

只是把它包装上的子查询的结果,

SELECT StatusReportID, 
     StatusReportTime, 
     CarNumber, 
     VehicleID, 
     DriverNumber, 
     DriverID, 
     VehicleStatus, 
     LocationX, 
     LocationY, 
     Speed, 
     Direction, 
     InvalidGPS 
FROM dbo_VehicleStatusReport 
WHERE StatusReportID > 
     ((SELECT max(StatusReportID) FROM dbo_VehicleStatusReport) - 3000) 
+0

我想你忘了'3000' ... –

+0

但我需要有( SELECT max(StatusReportID)FROM dbo_VehicleStatusReport) - 3000 – Mike

+0

他可以简单地添加'>((SELECT max(StatusReportID)FROM dbo_VehicleStatusReport) - 3000)' –

3
;WITH x AS 
(
    SELECT MaxSRID = MAX(StatusReportID) - 3000 
    FROM dbo_VehicleStatusReport 
) 
SELECT v.StatusReportID, v.StatusReportTime, ... 
FROM dbo_VehicleStatusReport AS v 
INNER JOIN x 
ON v.StatusReportID > x.MaxSRID; 

如果目标是要找到最新的2999项,再下面是更简单,更可靠:

SELECT TOP (2999) StatusReportID, StatusReportTime, ... 
FROM dbo_VehicleStatusReport 
ORDER BY StatusReportTime DESC; 

这是因为:

  1. IDENTITY值可以通过删除和回滚会丢失,所以依赖于MAX - 3000的查询可能不一定会产生2999行。
  2. IDENTITY列可以重新排列并且值可以被覆盖,所以假设稍后增加的值意味着可能存在问题。
+0

这是一个伟大而优雅的解决方案! – Mike