1

かなり単純なクエリが2つあり、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)を引いた結果です。

4

2 に答える 2

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)
于 2013-01-22T01:45:19.527 に答える
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列を再シードしたり、値をオーバーライドしたりできるため、値を増やすと後で問題が発生する可能性があると想定します。
于 2013-01-22T01:52:41.717 に答える