【问题标题】:SQL instead of trigger and updateSQL代替触发器和更新
【发布时间】: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


【解决方案1】:

让我们看看你的WHERE 条件:

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

它指出Rating.mID 应该在从评级中选择的stars 值之间。我不确定这里的意图是什么。假设您想为任何修改星星的尝试将星星数量减少 2(这很奇怪:您正在将 increase 星星的查询变成一些不相关的查询),如果 originalRating 表的行中的星数大于 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;

同样,对于您想要的内容有多种可能的解释,并且 他们都或多或少奇怪LateRating 中的mID 字段不是 足以识别Rating 中的原始记录(可能是rIDmID 在一起就足够了,如果你不允许同一个审阅者 同时对同一部电影持有不同的意见)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多