2つのテーブルがあり、どちらのテーブルにも「username」、「Date」、「Time」の同様の列が含まれています。1つのテーブル(表2)は、基本的に、日付ごとの「時間」列の合計であり、table1は日付ごとに複数の「時間」を持つことができます。
table1にデータを挿入するために使用されるステートメントを制御できないため、これを行う最善の方法は、その日付の行がすでに存在するかどうかに応じて、table2に挿入または更新するtable1のトリガーを使用することだと思いました。挿入されました。これを行うには、次のようなもので十分です。
IF NOT EXISTS(SELECT * FROM table2 WHERE date = @date/*date from inserted*/)
--insert into table 2 here
ELSE
--update table 2 here
ただし、問題は、トリガーで複数行のサポートが必要なことです。これにより、前のIF
失敗が発生します。1つのアイデアは、挿入の各行をループすることですが、私が読んだことから、これは避けたいパフォーマンスに大きな影響を与えます(これは、より良い方法がない場合の最後の手段です)。
それで、ある種のループを使用せずに必要なことを行う方法はありますか?
私が使用する挿入例:
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)
どうもありがとう!