我不理解这两个查询之间的差异。
首先,这是架构:
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年之后的电影。
答案 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
在此查询中,您要检查删除评论时提到的条件(电影的发行年份和评级)。