我有两个表,两个表都包含类似的“用户名”、“日期”和“时间”列。一个表(表 2)本质上是每个日期的“时间”列的总和,其中 table1 每个日期可以有多个“时间”。
我无法控制用于将数据插入 table1 的任何语句,所以我认为最好的方法是在 table1 上使用触发器,该触发器根据日期是否已经存在一行来插入或更新table2插入。要做到这一点,类似于以下内容就可以了:
IF NOT EXISTS(SELECT * FROM table2 WHERE date = @date/*date from inserted*/)
--insert into table 2 here
ELSE
--update table 2 here
但是,问题是我还需要触发器上的多行支持,这会导致之前的IF
失败。一个想法是循环插入的每一行,但从我读过的内容来看,这将对我想要避免的性能产生很大影响(如果没有更好的方法,这是最后的手段)。
那么,有没有办法在不使用某种循环的情况下做我需要的事情?
我将使用的示例插入:
INSERT INTO table2 (username, date, time)
SELECT i.username, i.date, SUM(w.time) FROM inserted AS i
JOIN (SELECT username, date, time FROM table1/*table with trigger*/) AS w
ON w.date = i.date AND w.username = i.username
GROUP BY i.username, i.date
提前感谢您的任何建议!
注意:我是 SQL 新手,如果我遗漏了任何内容/犯了明显的错误,我很抱歉!
编辑(解决方案):
工作解决方案(感谢@Ronak Vyas 的回答)如下:
MERGE table2 AS m
USING (SELECT i.username, i.date, SUM(w.time) FROM inserted AS i
JOIN (SELECT username, date, time FROM table1/*table with trigger*/) AS w
ON w.date = i.date AND w.username = i.username
GROUP BY i.username, i.date) AS s
ON m.date = s.date AND m.username = s.username
WHEN MATCHED THEN UPDATE SET m.duration = s.duration
WHEN NOT MATCHED THEN
INSERT (username, date, time)
VALUES (s.username, s.date, s.time)
非常感谢!