2013-02-12 7 views
0

Имеют две таблицы в базе данных SQL Server. Таблица №1 ClassicsRatings имеет RatingID, в качестве ключа, TitleID, Rating и Comment. Таблица №2, AVGRating, имеет TitleID, в качестве ключа, AvgRating и Count.Таблица SQL Server1 UPDATE Таблица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 , Я попытался 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 и иметь таблицу 2 отражают эту вставку. Любая помощь будет оценена по достоинству.

Я также использовал следующий триггер без результата:

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 (Рейтинг) AS AvgRating в таблице AVGRating не распознается триггером (исходный запрос распознает AvgRating). Я думаю, это будет означать, что, поскольку ClassicsRatings на самом деле не имеет AvgRating, но выполняет расчет/агрегат и заполняет таблицу AVGRating вычислением конфликта. Я пробовал в течение двух дней, чтобы заставить это работать. Моя проблема, похоже, в A.Count = I.Count A.AvgRating = I.AvgRating, потому что граф в таблице ClassicsRatings на самом деле COUNT (*) - не поле в ClassicsRatings, а AvgRating действительно AVG (Rating) - not поле в 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

+0

Большое спасибо Петар. Я думаю, я могу получить это отсюда. – user1830924

+0

Петар, я был неправ, я не понимаю. Если вы посмотрите на редактирование, которое я сделал выше, и если вы поймете мое редактирование, я буду признателен за любую помощь, которую вы могли бы мне дать. Большое спасибо. – user1830924

Смежные вопросы