【发布时间】:2013-01-27 16:53:38
【问题描述】:
我有这些表:
- 电影(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包含至少一部评分高于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。有什么问题?
【问题讨论】:
-
将您的数据集上传到可以下载的某个地方,而无需向 depositfiles 提供手机号码。真的是 2.44 Kb 吗?然后将其转储为 sql(sqlite3 客户端中的
.dump命令),甚至可以将其粘贴到您的问题中(如果它有点大,请将其放在 pastebin 或类似的东西上) -
@AntonKovalenko 我编辑了链接。
-
@AntonKovalenko 还有你有 MSN 帐户吗?我有几个类似的问题。
-
电影 101 的评分中有两个条目,一个为 2:
201|101|2|2011-01-22,另一个为 4:201|101|4|2011-01-27。其中一个是错的吗?只有您可以知道他们是如何到达那里的,但视图和触发器可能无关紧要。 (没有 MSN 帐户。使用我的网络配置文件中的电子邮件,但我会为这种支持请求补偿) -
@AntonKovalenko 不,他们没有错。用户评论了两次电影。仅此而已。错误的部分是它有 4 颗星,所以 4 - 2 应该变成 2,但它没有:( 跨度>
标签: sql sqlite triggers sql-update