两个删除查询之间的SQL差异

3
我不明白这两个查询之间的区别。
首先,这是数据库模式:
 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年之后的电影中生成,然后在Rating中查找该并删除该行。(至少我认为它是这样做的)
在第二个查询中,我从Rating表中删除那些星级小于4且是年份在1970年之前或2000年之后的电影的所有行。

1
这是来自斯坦福大学的在线数据库课程吗?让我想起了往事 :P - Syed Farjad Zia Zaidi
如果你单独运行这两个子查询,我想你会明白为什么。 - Mr. Mascaro
是的,我明白结果上的差异,但我不理解逻辑上的差异。 - FranGoitia
1
提示:电影可以有多个评分。 - Dour High Arch
1个回答

4
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星级的电影的4或5星级评价。删除评论的唯一检查是mID而不是评分。
DELETE FROM Rating
WHERE mID in 
            (SELECT mID
             FROM Movie
             WHERE year < 1970 or year > 2000)
and stars < 4

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接