2011-09-04 97 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