0

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のフィールド。

4

1 に答える 1

1

それを実現するには、トリガーを使用する必要があります。最初のテーブルへの挿入があるときにクエリを実行する「挿入時」トリガーを作成するだけです。

トリガーでは、挿入された行を含む論理 INSERTED を使用する必要があります。何かのようなもの:

CREATE TRIGGER AVGRatingTrigger
ON ClassicsRatings
AFTER INSERT AS

BEGIN
UPDATE A
SET A.xxx = I.xxx,
    A.yyy = I.yyy,
    ...
FROM AVGRatings as A
INNER JOIN INSERTED as I ON A.TitleID = I.TitleID 
END
于 2013-02-12T17:49:35.250 に答える