2011-09-04 129 views
0

我需要幫助做到這一點:插入或更新從插入到其他表中的一個表

TABLE POSITION 
ID, int (PK) 
SN, varchar(10) 
Lat, double 
Lon, double 
etc... 

TABLE ACTUAL_POSITION 
SN, varchar(10) (PK) 
Lat, double 
Lon, double 

當記錄插入第一個表,相應的(由SN)記錄應在第二個表進行更新。如果在該表中找不到SN記錄,則應該創建該記錄。

即使對於同一個SN,第一個表中也會同時插入多條記錄,所以我需要爲每個SN提取最後一個Lat和Lon(當車輛超出連接範圍時,它們將緩衝數據發送,然後將其全部發送到接收器,以便接收的sw可以從插入的表中一次寫入sql中)。

+0

你如何定義「最後一個」?表格是一組無序的行,所以您需要定義「last」的含義,並且需要通過某種方式從數據中找出結果。想象一下,將一袋大理石扔在地板上,然後問剛剛進屋的人,大理石最後撞到了地板上? –

回答

2
CREATE TRIGGER dbo.SummarizePosition 
ON dbo.Position 
FOR INSERT 
AS 
BEGIN 
    ;WITH x AS 
    (
     SELECT SN, Lat, Long, 
     rn = ROW_NUMBER() OVER (PARTITION BY SN 
     ORDER BY ID DESC) -- or by timestamp col desc 
     FROM inserted 
     WHERE EXISTS 
     (SELECT 1 FROM dbo.Actual_Position AS p 
     WHERE p.SN = inserted.SN 
    ) 
    ) 
    UPDATE p 
     SET p.Lat = x.Lat, 
     p.Lon = x.Lon 
     FROM dbo.Actual_Position AS p 
     INNER JOIN x ON x.sn = p.sn 
     WHERE x.rn = 1; 

    ;WITH x AS 
    (
     SELECT SN, Lat, Long, /* other cols, */ 
     rn = ROW_NUMBER() OVER (PARTITION BY SN 
     ORDER BY ID DESC) -- or by timestamp col desc 
     FROM inserted 
     WHERE NOT EXISTS 
     (SELECT 1 FROM dbo.Actual_Position AS p 
     WHERE p.SN = inserted.SN 
    ) 
    ) 
    INSERT dbo.Actual_Position(SN, Lat, Long /*, other cols */) 
     SELECT SN, Lat, Lon /*, other cols */ 
     FROM x 
     WHERE rn = 1; 
END 
GO 
+0

完美,謝謝! – user927586

0

每次在POSITION中插入新行時,都可以創建一個觸發器來更新ACTUAL_POSITION。

有關SQL Server 2005中觸發器的更多信息,請參見this MSDN article

+0

問題是如果有兩行具有相同的SN,哪一行進入了'ACTUAL_POSITION'?需要定義如何確定「最後一行」...... –

+0

我認爲OP意味着按時間順序排列,在這種情況下,我相信觸發器就足夠了。另外,雖然他沒有提供整個表格定義,但我想在那裏有一個時間戳列。 – dandan78

+0

我正在考慮關於插入順序......但是,如果它更好,在「etc」列中我也有一個(unix)時間戳列,所以我可以考慮「最後一行」(總是每個SN)一個更大的時間戳 – user927586