Sql server 向一个表中插入数据时更新其他表的查询

Sql server 向一个表中插入数据时更新其他表的查询,sql-server,Sql Server,我正在寻找在将数据插入表1时更新和插入表2的解决方案 表1 --------------------------------------- | id |Student name | % | Date of Exam | --------------------------------------- | 1 | Tom | 80 | 12/03/2015 | | 2 | Jack | 90 | 12/03/2015 | | 1 | Tom |

我正在寻找在将数据插入表1时更新和插入表2的解决方案

表1

---------------------------------------
| id |Student name | % | Date of Exam |
---------------------------------------
| 1  | Tom         | 80 | 12/03/2015  |
| 2  | Jack        | 90 | 12/03/2015  |
| 1  | Tom         | 85 | 21/05/2015  |
---------------------------------------
表2(待更新)

如果我想插入的表2中没有“id”,并且如果它存在,则应更新表的行

请有人帮我找到解决办法

提前感谢。

您可以使用触发器(插入时)或存储过程来插入或更新一个或多个表


如果表1曾经更新过,那么表2也应该相应地更新。在insert和update时编写触发器会很有用。

如果需要持久化的表解决方案,可以使用
触发器在每次在
表1
中插入一行时重新计算最后的结果,并相应地使用
插入的
表2
(“LastScore”)伪行插入/更新
表2
(“LastScore”)

CREATE TRIGGER tCalcLastScore ON Table1
AFTER INSERT, UPDATE AS
BEGIN
  DELETE a
  FROM LastScore a
  INNER JOIN inserted i
  on i.id = a.id;

  INSERT INTO LastScore(id, [Percent])
    SELECT id, [Percent] FROM
    ( SELECT t1.id, t1.[Percent], 
      ROW_NUMBER() OVER (PARTITION BY t1.id ORDER BY t1.DateOfExam DESC) AS RowId
      FROM Table1 t1 INNER JOIN inserted i 
           ON i.id = t1.id
    ) x WHERE RowId = 1;
END;

注释

  • 请记住,触发器必须处理多个插入的
    行-我使用了一个带有过滤器的
    行数
    函数来确定每个学生的最后一行
  • 如果可以从第一个表中删除行,则还需要在已删除的
上添加一个触发器,并处理已删除的
伪行
  • 我一直很懒,刚删除并重新插入第二个表(
    LastScore
    ),但是合并也是可能的
  • 但是,一种非持久化的替代方法是每次使用视图动态计算最后的分数:

    CREATE VIEW LastScore AS
       SELECT id, [Percent] 
       FROM
       (
         SELECT id, [Percent],
              ROW_NUMBER() OVER (PARTITION BY t1.id ORDER BY t1.DateOfExam DESC) AS RowId
              FROM Table1 t1
       ) x 
       WHERE RowId = 1;
    


    如果在
    表1(id,DateOfExam)

    上有索引,则视图的性能应该合理?另外,请通过提供预期结果来详细说明。您的意思是像触发器一样?我使用的是sql server 2008。预期结果是,我想从Table1@wewewesthemenance中存储表2中上次考试的“id”和“%”分数。您还应该研究使用索引视图,这可能是一个更好的解决方案
    CREATE VIEW LastScore AS
       SELECT id, [Percent] 
       FROM
       (
         SELECT id, [Percent],
              ROW_NUMBER() OVER (PARTITION BY t1.id ORDER BY t1.DateOfExam DESC) AS RowId
              FROM Table1 t1
       ) x 
       WHERE RowId = 1;