首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >触发器来更新另一个表,以引用更新后的表中最顶层的行。

触发器来更新另一个表,以引用更新后的表中最顶层的行。
EN

Stack Overflow用户
提问于 2015-06-30 01:55:23
回答 1查看 67关注 0票数 0

这是我的表。

代码语言:javascript
复制
MeterID int
LatestMeterReadingID int refers MeterReading

MeterReadingTable

代码语言:javascript
复制
MeterID int
MeterReadingID int
Reading bigint
ForDate date
isInactive bit

我希望在表表上设置一个触发器,以便在更新/插入表时将最新的表读数放在表上。

  1. 新表读数
  2. 更新现有的电表读数、日期或仪表(也会影响旧表)或禁用电表读数

如果日期相等的话,我也想要更高的读数。

我已经通过ORM完成了这个任务,但是我希望将这个逻辑转移到数据库中。我可以做它的插入部分,但不确定如何处理更新。

最上面的意思是这个

代码语言:javascript
复制
 Where isInactive=0 Order By ForDate DESC, Reading DESC
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-30 05:53:52

我想这就是你需要的。它可能需要一些调整:

代码语言:javascript
复制
CREATE TRIGGER dbo.MeterReadingTrigger 
   ON  dbo.MeterReading 
   AFTER INSERT,UPDATE
AS 
BEGIN
    SET NOCOUNT ON;

  ;WITH cte AS
  (
    SELECT
      ROW_NUMBER() OVER (PARTITION BY MeterID ORDER BY MeterID, ForDate DESC, Reading DESC) AS Row,
      mr.MeterID,
      mr.MeterReadingID,
      mr.Reading,
      mr.ForDate,
      mr.IsInactive
    FROM
      dbo.MeterReading AS mr
    JOIN Inserted i ON mr.MeterId = i.MeterID
    WHERE
      mr.IsInactive = 0        
  )
  UPDATE m
   SET m.LatestMeterReadingId = cte.MeterReadingId
  FROM
    cte JOIN
    INSERTED i 
      ON cte.MeterID = i.MeterId
    JOIN Meter m
      ON m.MeterID = i.MeterId
  WHERE
    Row = 1


END
GO

使用插入到CTE中的联接更新应答。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31128313

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档