2011-11-18 60 views
3

我有一個彙總表從主表中返回數據。我試圖從主表中的值作爲更新等一些總結的數據:使用SQL中的子查詢更新多行

update #summary 
    set TopSpeed = CD.TopSpeed, SpeedTime = CD.TimeSent, SpeedDriver = CD.Driver 
from 
(
    select top 1 TopSpeed, TimeSent, Driver 
    from CarData 
    where CarData.VehicleId = #summary.VehicleId 
    and CarData.TimeSent between #summary.Start and #summary.Stop 
    order by CarData.TopSpeed desc, TimeSent desc 
) as CD 

的#summary臨時表創建有關汽車進行旅行彙總數據。每次旅行都有多次旅行,每次旅行都有開始和結束時間。 CarData表包含所有詳細的汽車數據,如速度和位置等。

請幫助你嗎?

感謝, 羅伯特

+0

您正在使用哪個數據庫? – TheBoyan

+0

Microsoft SQL Server 2000 –

+0

您是否遇到某種錯誤? – Bert

回答

1

試試這個:

UPDATE 
    #summary 
SET 
    #summary.TopSpeed = CarData.TopSpeed , 
    #summary.SpeedTime = CarData.SpeedTime 
    ... 
FROM 
    #summary 
INNER JOIN 
    CarData 
ON 
    #summary.id = CarData.id AND (CarData.TimeSent BETWEEN #summary.Start AND #summary.Stop) 
+0

會盡力回覆給您。 –

+0

我需要子查詢使用匯總表中的日期範圍。我如何解答這個問題? –

+0

是smalldatetime或datetime類型的TimeSent? – TheBoyan

0

如果這裏有一個辦法做到這一點,雖然我不喜歡做的子查詢3次。這是我希望有人有更好的主意的情況之一。

update #summary 
    set TopSpeed = 
    (
     select top 1 TopSpeed 
     from CarData 
     where CarData.VehicleId = #summary.VehicleId 
     and CarData.TimeSent between #summary.Start and #summary.Stop 
     order by CarData.TopSpeed desc, TimeSent desc 
) 
    SpeedTime = 
    (
     select top 1 SpeedTime 
     from CarData 
     where CarData.VehicleId = #summary.VehicleId 
     and CarData.TimeSent between #summary.Start and #summary.Stop 
     order by CarData.TopSpeed desc, TimeSent desc 
) 
    SpeedDriver = 
    (
     select top 1 SpeedDriver 
     from CarData 
     where CarData.VehicleId = #summary.VehicleId 
     and CarData.TimeSent between #summary.Start and #summary.Stop 
     order by CarData.TopSpeed desc, TimeSent desc 
    ) 
+0

將盡力回覆您 –

+0

子查詢需要#summary表中的日期範圍,其中存在問題。 –

+0

如果你嫁給了前1,用一種有些殘忍的方式更新它。使用聚合函數可能會更容易。我不知道top 1是否足夠快,可以補償3次。 – Bert