2

我有这些表:

  • 电影(mID、片名、年份、导演)
  • 审稿人(rID,姓名)
  • 评级(rID、mID、星数、ratingDate)

和一些观点:

  • 视图LateRating包含 2011 年 1 月 20 日之后的电影评分。视图包含电影 ID、电影名称、星数和评分日期。

    create view LateRating as 
      select distinct R.mID, title, stars, ratingDate 
      from Rating R, Movie M 
      where R.mID = M.mID 
      and ratingDate > '2011-01-20' 
    
  • 视图HighlyRated包含至少有 1 个评分高于 3 星的电影。该视图包含电影 ID 和电影标题。

    create view HighlyRated as 
      select mID, title 
      from Movie 
      where mID in (select mID from Rating where stars > 3) 
    
  • ViewNoRating包含数据库中没有评分的电影。该视图包含电影 ID 和电影标题。

    create view NoRating as 
      select mID, title 
      from Movie 
      where mID not in (select mID from Rating)  
    

这是我的数据集:https ://prod-c2g.s3.amazonaws.com/db/Winter2013/files/viewmovie.sql

我被要求编写一个代替触发器来更新视图 LateRating 的 stars 属性。这是我的方法。

CREATE trigger update_LateRating_title INSTEAD OF 
UPDATE OF stars ON LateRating
BEGIN
  UPDATE Rating SET stars = stars - 2 
  WHERE Rating.mID = old.mID 
  AND Rating.mID IN (SELECT stars FROM Rating WHERE stars > 2);
END;

它给出了几乎正确的答案,但只有一个错误的行是 201 101 4 2011-01-27.4 应该是 2。出了什么问题?

4

1 回答 1

1

让我们看看你的WHERE情况:

...AND Rating.mID IN (SELECT stars FROM Rating WHERE stars > 2)

它指出Rating.mID应该在stars从评级中选择的值中。我不确定这里的意图是什么。假设您想为任何修改星的尝试将星数减少 2(这很奇怪:您正在将增加星数的查询转换为一些不相关的查询),如果该行中的原始星数大于2.Rating

CREATE trigger update_LateRating_stars INSTEAD OF 
UPDATE OF stars ON LateRating
BEGIN
  UPDATE Rating SET stars = stars - 2 
  WHERE Rating.mID = old.mID 
  AND Rating.stars > 2;
END;

同样,对于您想要的内容有许多可能的解释, 它们都或多或少有些奇怪mID字段 inLateRating不足以识别原始记录Rating(如果您不允许同一个审阅者同时对同一部电影持有不同意见)。rIDmID

于 2013-01-27T17:44:27.157 回答