SQL两个删除查询之间的区别

时间:2014-10-10 14:48:02

标签: sql where sql-delete

我不理解这两个查询之间的差异。

首先,这是架构:

 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年之前或之后的年份生成mID。然后查看评分为mID并删除行。 (至少那是我认为它正在做的事情)

在第二个查询中,我将从评级表中删除星号小于4的所有行,而mID则是年份在1970年之前或2000年之后的电影。

1 个答案:

答案 0 :(得分: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与评分的mID匹配,评分为4或更低的星级,这意味着您甚至删除了对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

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