【问题标题】:SQL Difference between two delete queries两个删除查询之间的 SQL 区别
【发布时间】:2014-10-10 14:48:01
【问题描述】:

我不明白这两个查询之间的区别。

首先,这是架构:

 Movie ( mID, title, year, director )
English: There is a movie with ID number mID, a title, a release year, and a director.

Reviewer ( rID, name )
English: The reviewer with ID number rID has a certain name.

Rating ( rID, mID, stars, ratingDate )
English: The reviewer rID gave the movie mID a number of stars rating (1-5) on a certain ratingDate. 

问什么:

 Remove all ratings where the movie's year is before 1970 or after 2000, and the rating is fewer than 4 stars. 

两个查询:

DELETE FROM Rating
WHERE mID in 
            (SELECT m.mID
             FROM Movie m JOIN Rating r ON m.mID = r.mID
             WHERE (year < 1970 or year > 2000) and stars < 4)

DELETE FROM Rating
WHERE mID in 
            (SELECT mID
             FROM Movie
             WHERE year < 1970 or year > 2000)
and stars < 4

现在,第一个查询不正确,而第二个查询不正确,但我不明白为什么。

在第一个查询中,我从评级低于 4 星的所有电影以及 1970 年之前或 2000 年之后的年份生成 mID。然后在评级中查找 mID 并删除该行。 (至少我认为它是这样做的)

在第二个查询中,我从 Rating 表中删除所有星数小于 4 的行,并且 mID 是一部电影,其年份在 1970 年之前或 2000 年之后。

【问题讨论】:

  • 这是来自斯坦福的数据库在线课程吗?带回回忆:P
  • 我想你会明白为什么如果你自己运行这两个子查询。
  • 是的。我明白结果的不同,我不明白逻辑的不同。
  • 提示:电影可以有多个评分。

标签: sql where sql-delete


【解决方案1】:
DELETE FROM Rating
WHERE mID in 
            (SELECT m.mID
             FROM Movie m JOIN Rating r ON m.mID = r.mID
             WHERE (year < 1970 or year > 2000) and stars < 4)

在此查询中,您将删除 mID 与评级为 4 星或更少的评论的 mID 匹配的所有评论,这意味着您甚至删除了 1970 年之前或 2000 年之后发行的电影的 4 星或 5 星评级的评论至少有一篇评分低于 4 星的评论。删除评论的唯一检查是 mID 而不是评级。

DELETE FROM Rating
WHERE mID in 
            (SELECT mID
             FROM Movie
             WHERE year < 1970 or year > 2000)
and stars < 4

在此查询中,您正在检查删除评论所提到的两个条件(电影的发行年份和评级)。

【讨论】:

    猜你喜欢
    • 2015-08-17
    • 2017-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-13
    • 2014-06-02
    相关资源
    最近更新 更多