我有这些表格:
和一些观点:
查看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
包含至少有一个等级超过3星的电影。该视图包含电影ID和电影标题。
create view HighlyRated as
select mID, title
from Movie
where mID in (select mID from Rating where stars > 3)
查看NoRating
包含数据库中没有评级的电影。该视图包含电影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.出了什么问题?
答案 0 :(得分:1)
让我们看一下你的WHERE
条件:
...AND Rating.mID IN (SELECT stars FROM Rating WHERE stars > 2)
它声明Rating.mID
应该是从评级中选择的stars
值。我不确定这里的目的是什么。假设你想要修改星星的任何尝试都要减少2的星数(这很奇怪:如果原始<,那么你将把增加星星的查询变成一些不相关的查询) / em> 中Rating
表的行中的星数大于2。
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
中的LateRating
字段不是
足以识别Rating
中的原始记录(可能是rID
和
如果你不允许同一个评论者,mID
就足够了
同时对同一部电影持不同意见。)