3

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)

どうもありがとう!

4

1 に答える 1

4

マージステートメントを使用してみてください。

http://blog.sqlauthority.com/2008/08/28/sql-server-2008-introduction-to-merge-statement-one-statement-for-insert-update-delete/にアクセスします

うまくいけば、これが役立つでしょう。

于 2013-02-18T11:26:13.397 に答える