我正在寻找在将数据插入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”我想插入,如果它存在,则应该更新表的行。
请有人帮我找到解决方案。
提前致谢。
答案 0 :(得分:1)
如果您需要持久表解决方案,则可以使用<a>
触发器在每次插入行AFTER
并插入/更新Table1
时重新计算最后结果(“LastScore” “)相应地,使用Table2
伪行。
inserted
注释
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
如果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。在插入和更新上编写触发器会很有用。