SQLServerデータベースに2つのテーブルがあります。表#1ClassicsRatings
にはRatingID
、キーとして、、、、TitleID
およびRating
がありComment
ます。表#2 、、AVGRating
にはTitleID
、キーとして、、、がAvgRating
ありCount
ます。
次のクエリは、クエリが最初にテーブル#1で実行されるときに、テーブル#2を更新します。
INSERT INTO AVGRating
SELECT TitleID, Count(*) AS Count, AVG(Rating) AS AvgRating
FROM ClassicsRatings
GROUP BY TitleID
ORDER BY TitleID
私の問題は、後続のINSERTがテーブル#1になったときにテーブル#2を更新する方法です。MERGE
私は次のように試しUPDATE
ました:
MERGE AVGRating AS AR
USING ( SELECT TitleID, COUNT(*) AS Count, AVG(Rating) AS AvgRating
FROM ClassicsRatings
GROUP BY RecipeID) AS ClassicsRatings(RecipeID, Count, AvgRating)
ON
(
AR.RecipeID = ClassicsRatings.RecipeID
)
WHEN NOT MATCHED THEN
INSERT (RecipeID, Count, AvgRating)
VALUES (ClassicsRatings.RecipeID, ClassicsRatings.Count, ClassicsRatings.AvgRating)
WHEN MATCHED THEN
UPDATE
SET AR.Count = ClassicsRatings.Count,
AR.AvgARating = ClassicsRatings.AvgRating;
UPDATE AVGRating
SET
AVGRating.TitleID = ClassicsRatings.TitleID,
AVGRating.AvgRating = ClassicsRatings.AvgRating,
AVGRating.Count = ClassicsRatings.Count
FROM AVGRating
INNER JOIN ClassicsRatings ON
AVGRating.TitleID = ClassicsRatings.TitleID
WHERE TitleID = TitleID
私が実現できないのは、表1にINSERTを実行し、表2にそのINSERTを反映させることです。どんな助けでもいただければ幸いです。
次のTRIGGERも使用しましたが、結果はありませんでした。
CREATE TRIGGER AVGRatingTrigger
ON ClassicsRatings
AFTER INSERT AS
DECLARE @TitleID INT
DECLARE @Count INT
DECLARE @RatingAVG INT
BEGIN
UPDATE AVGRatings
WHERE AVGRatings.TitleID = ClassicsRatings.TitleID
END
トリガーが次のように変更されました。
CREATE TRIGGER AVGRatingTrigger
ON ClassicsRatings
AFTER INSERT AS
BEGIN
UPDATE A
SET A.TitleID = I.TitleID,
A.Count = I.Count,
A.AvgRating = I.AvgRating
FROM AVGRating as A
INNER JOIN INSERTED as I ON A.TitelID = I.TitleID
END
トリガーでエラーメッセージは表示されませんでしたが、ClassicRatingsに新しい評価を挿入すると、「Invalid objectAvgRating」というエラーメッセージが表示されます。AVGRatingテーブルのAVG(Rating)ASAvgRatingのAvgRating部分がトリガーによって認識されます(最初のクエリはAvgRatingを認識します)。これは、ClassicsRatingsには実際にはAvgRatingがないが、計算/集計を行い、AVGRatingテーブルに計算を入力するため、競合が発生していることを意味すると思います。私はこれを機能させるために2日間試みました。私の問題はA.Count=I.Count A.AvgRating = I.AvgRatingにあるようです。これは、ClassicsRatingsテーブルのCountが実際にはCOUNT(*)であり、ClassicsRatingsのフィールドではなく、AvgRatingが実際にはAVG(Rating)であるためです。 ClassicsRatingsのフィールド。