【问题标题】:SQL Server Table1 UPDATE Table2SQL Server 表 1 更新表 2
【发布时间】:2013-02-16 04:37:12
【问题描述】:

在 SQL Server 数据库中有两个表。表 #1 ClassicsRatings 具有 RatingID 作为键,TitleIDRatingComment。表 #2 AVGRatingTitleID 作为键,AvgRatingCount

当查询最初在表 #1 上运行时,以下查询会更新表 #2:

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

我的问题是:如何在随后的 INSERTS 插入表 #1 时更新表 #2。我试过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 反映该插入。任何帮助将不胜感激。

我还使用了以下 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 中插入新评级时,我收到错误消息“无效对象 AvgRating”似乎 AVG(Rating) 的 AvgRating 部分在 AVGRating 表中为 AvgRating未被触发器识别(初始查询确实识别 AvgRating)。我认为这意味着由于 ClassicsRatings 实际上没有 AvgRating 而是进行计算/聚合并使用计算填充 AVGRating 表,因此正在发生冲突。我已经尝试了两天来让它工作。我的问题似乎出在 A.Count = I.Count A.AvgRating = I.AvgRating 因为 ClassicsRatings 表中的 Count 实际上是 COUNT(*) - 不是 ClassicsRatings 中的字段,而 AvgRating 真的是 AVG(Rating) - 不是ClassicsRatings 中的一个字段。任何帮助将不胜感激。

【问题讨论】:

    标签: sql-server-2008


    【解决方案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
    

    【讨论】:

    • 感谢您的回复。请参阅我对初始帖子所做的编辑。谢谢。
    • 非常感谢 Petar。我想我可以从这里得到它。
    • Petar,我错了,我听不懂。如果您愿意,请查看我在上面所做的编辑,如果您能理解我的编辑,我将不胜感激您能给我的任何帮助。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2012-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-10
    • 2021-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多