插入或更新从插入到其他表中的一个表
我需要帮助做到这一点:插入或更新从插入到其他表中的一个表
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中)。
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
完美,谢谢! – user927586
每次在POSITION中插入新行时,都可以创建一个触发器来更新ACTUAL_POSITION。
有关SQL Server 2005中触发器的更多信息,请参见this MSDN article。
问题是如果有两行具有相同的SN,哪一行进入了'ACTUAL_POSITION'?需要定义如何确定“最后一行”...... –
我认为OP意味着按时间顺序排列,在这种情况下,我相信触发器就足够了。另外,虽然他没有提供整个表格定义,但我想在那里有一个时间戳列。 – dandan78
我正在考虑关于插入顺序......但是,如果它更好,在“etc”列中我也有一个(unix)时间戳列,所以我可以考虑“最后一行”(总是每个SN)一个更大的时间戳 – user927586
你如何定义“最后一个”?表格是一组无序的行,所以您需要定义“last”的含义,并且需要通过某种方式从数据中找出结果。想象一下,将一袋大理石扔在地板上,然后问刚刚进屋的人,大理石最后撞到了地板上? –