Sql server 向一个表中插入数据时更新其他表的查询
我正在寻找在将数据插入表1时更新和插入表2的解决方案 表1Sql 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 |
---------------------------------------
| 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;