2013-02-12 75 views
0

在SQL Server數據庫中有兩個表。表#1 ClassicsRatings具有RatingID,作爲密鑰,TitleID,RatingComment。表#2,AVGRating,具有TitleID,作爲關鍵,AvgRatingCountSQL Server表1更新表2

下面的查詢更新表#2時查詢最初的表#1運行:

INSERT INTO AVGRating 
    SELECT TitleID, Count(*) AS Count, AVG(Rating) AS AvgRating 
    FROM ClassicsRatings 
    GROUP BY TitleID 
    ORDER BY TitleID 

我的問題是:如何讓表#2更新時,後續插入被製成表#1 。我曾嘗試MERGEUPDATE如下:

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和表有2反映INSERT。任何幫助,將不勝感激。

我還使用了下面的觸發器沒有結果:

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 object AvgRating」看起來AVGRating表中的AVG(Rating)AS AvgRating的AvgRating部分沒有被觸發器識別(初始查詢確認了AvgRating)。我認爲這意味着由於ClassicsRatings實際上並不具有AvgRating,但是進行了計算/聚合,並且使用計算填充AVGRating表時發生了衝突。我試了兩天才得到這個工作。我的問題似乎在A.Count = I.Count A.AvgRating = I.AvgRating,因爲ClassicsRatings表中的Count實際上是COUNT(*) - 而不是ClassicsRatings中的字段,AvgRating實際上是AVG(Rating) - 不是ClassicsRatings中的一個字段。任何幫助將不勝感激。

回答

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 
+0

謝謝你的迴應。請參閱我對我的初始帖子的編輯。謝謝。 – user1830924 2013-02-12 19:02:07

+0

非常感謝Petar。我想我可以從這裏得到它。 – user1830924 2013-02-12 20:28:54

+0

Petar,我錯了,我無法得到它。如果你願意看看我上面所做的編輯,如果你能理解我的編輯,我將不勝感激任何幫助。非常感謝你。 – user1830924 2013-02-15 20:31:53