在将数据插入一个表时查询更新其他表

时间:2015-06-19 06:04:58

标签: sql-server

我正在寻找在将数据插入Table1时更新和插入Table2的解决方案,

表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(待更新)

---------------
| id  |  %    |
---------------
|  1  |  85   |
|  2  |  90   |
---------------     

如果Table2中没有“id”我想插入,如果它存在,则应该更新表的行。

请有人帮我找到解决方案。

提前致谢。

2 个答案:

答案 0 :(得分:1)

如果您需要持久表解决方案,则可以使用<a>触发器在每次插入行AFTER并插入/更新Table1时重新计算最后结果(“LastScore” “)相应地,使用Table2伪行。

inserted

SqlFiddle here

注释

  • 请记住,触发器必须处理多个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; 行 - 我使用带有过滤器的inserted函数来确定每个学生的最后一行。
  • 如果可以从第一个表中删除行,则还需要向ROW_NUMBER添加触发器并处理ON DELETED伪行
  • 我一直懒惰,只是删除+重新插入第二个表(deleted),但也可以合并。

但是,一个非持久的替代方法是使用视图每次动态计算最后得分:

LastScore

View Fiddle

如果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 :(得分:0)

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

如果更新了table1,还应该相应地更新table2。在插入和更新上编写触发器会很有用。