【问题标题】:Insert or Update in one table from inserted in another table从插入到另一个表中插入或更新到一个表中
【发布时间】:2011-09-04 13:45:03
【问题描述】:

我需要帮助:

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。

【问题讨论】:

  • 你如何定义“最后”?表是一组无序的行,因此您需要定义“最后一个”的含义,并且需要某种方法从数据中找出这一点。想象一下,将一袋弹珠倒在地板上,然后问刚走进房间的人哪颗弹珠最后落到地板上?

标签: sql-server sql-server-2005


【解决方案1】:
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

【讨论】:

    【解决方案2】:

    您可以创建一个触发器以在每次在 POSITION 中插入新行时更新 ACTUAL_POSITION。

    有关 SQL Server 2005 中触发器的详细信息,请参阅this MSDN article

    【讨论】:

    • 问题是如果有两行相同的SN,哪一行进入ACTUAL_POSITION?需要定义如何确定“最后一行”...
    • 我认为 OP 是按时间顺序排列的,在这种情况下,我相信触发器就足够了。另外,虽然他没有提供完整的表定义,但我想那里有一个时间戳列。
    • 我只是在考虑插入顺序......但是,如果更好的话,在“etc”列中我还有一个(unix)时间戳列,所以我可以考虑“最后一行"(总是每个 SN)时间戳较大的那个
    猜你喜欢
    • 1970-01-01
    • 2017-08-01
    • 1970-01-01
    • 2016-08-20
    • 1970-01-01
    • 1970-01-01
    • 2012-05-01
    • 2015-10-30
    • 1970-01-01
    相关资源
    最近更新 更多