gpt4 book ai didi

SQL代替触发器和更新

转载 作者:行者123 更新时间:2023-12-03 17:59:10 26 4
gpt4 key购买 nike

我有这些表:

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

  • 和一些观点:
  • 查看 LateRating包含 2011 年 1 月 20 日之后的电影评分。 View 包含电影 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 星的电影。该 View 包含电影 ID 和电影标题。
    create view HighlyRated as 
    select mID, title
    from Movie
    where mID in (select mID from Rating where stars > 3)
  • 查看 NoRating包含数据库中没有评分的电影。该 View 包含电影 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

    我被要求编写一个代替触发器来更新 View 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。出了什么问题?

    最佳答案

    让我们看看你的WHERE健康)状况:

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

    它指出 Rating.mID应该在 stars 的值之间从评级中选择。我不确定这里的意图是什么。假设您想要将任何修改星的尝试减少 2 星(这很奇怪:您正在将增加星数的查询转换为一些不相关的查询),如果 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 中的原始记录(也许 rIDmID在一起就足够了,如果你不允许同一个审稿人
    同时对同一部电影持有不同意见)。

    关于SQL代替触发器和更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14549688/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com