触发更新现有数据或插入数据不存在(多行支持)

时间:2013-02-18 10:58:58

标签: sql sql-server-2008 triggers

我有两个表,两个表都包含类似的“用户名”,“日期”和“时间”列。一个表(表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)

非常感谢!

1 个答案:

答案 0 :(得分:4)