我是SQL的初学者,我正在斯坦福拉古尼塔上讨论运动问题并遇到一个奇怪的行为,当我使用时,我会得到不同的结果!=而不是<对于不相等的值。
以下是问题:
“对于同一评论者对同一部电影进行过两次评分的所有情况 第二次给它一个更高的评价,返回评论者的名字 和电影的标题。“
这是架构:
/* Delete the tables if they already exist */
drop table if exists Movie;
drop table if exists Reviewer;
drop table if exists Rating;
/* Create the schema for our tables */
create table Movie(mID int, title text, year int, director text);
create table Reviewer(rID int, name text);
create table Rating(rID int, mID int, stars int, ratingDate date);
/* Populate the tables with our data */
insert into Movie values(101, 'Gone with the Wind', 1939, 'Victor Fleming');
insert into Movie values(102, 'Star Wars', 1977, 'George Lucas');
insert into Movie values(103, 'The Sound of Music', 1965, 'Robert Wise');
insert into Movie values(104, 'E.T.', 1982, 'Steven Spielberg');
insert into Movie values(105, 'Titanic', 1997, 'James Cameron');
insert into Movie values(106, 'Snow White', 1937, null);
insert into Movie values(107, 'Avatar', 2009, 'James Cameron');
insert into Movie values(108, 'Raiders of the Lost Ark', 1981, 'Steven Spielberg');
insert into Reviewer values(201, 'Sarah Martinez');
insert into Reviewer values(202, 'Daniel Lewis');
insert into Reviewer values(203, 'Brittany Harris');
insert into Reviewer values(204, 'Mike Anderson');
insert into Reviewer values(205, 'Chris Jackson');
insert into Reviewer values(206, 'Elizabeth Thomas');
insert into Reviewer values(207, 'James Cameron');
insert into Reviewer values(208, 'Ashley White');
insert into Rating values(201, 101, 2, '2011-01-22');
insert into Rating values(201, 101, 4, '2011-01-27');
insert into Rating values(202, 106, 4, null);
insert into Rating values(203, 103, 2, '2011-01-20');
insert into Rating values(203, 108, 4, '2011-01-12');
insert into Rating values(203, 108, 2, '2011-01-30');
insert into Rating values(204, 101, 3, '2011-01-09');
insert into Rating values(205, 103, 3, '2011-01-27');
insert into Rating values(205, 104, 2, '2011-01-22');
insert into Rating values(205, 108, 4, null);
insert into Rating values(206, 107, 3, '2011-01-15');
insert into Rating values(206, 106, 5, '2011-01-19');
insert into Rating values(207, 107, 5, '2011-01-20');
insert into Rating values(208, 104, 3, '2011-01-02');
我的工作解决方案:
SELECT Reviewer.name, Movie.title
FROM Rating r1, Rating r2, Movie, Reviewer
WHERE Reviewer.rID = r1.rID and Reviewer.rID = r2.rID and
Movie.mID = r1.mID and Movie.mID = r2.mID and
r1.rID = r2.rID and r1.mID = r2.mID and
r1.ratingDate < r2.ratingDate and
r2.stars > r1.stars
现在,如果您查看架构,您会看到在同一部电影上有重复评论的评论者(只有评论者rID:201和203)有不同的评分日期,所以如果我改变
r1.ratingDate < r2.ratingDate
到r1.ratingDate != r2.ratingDate
,结果将包括Brittany Harris(rID:203),这也是错误的。
有人能告诉我为什么会这样吗?
由于
答案 0 :(得分:0)
r1.ratingDate < r2.ratingDate and r2.stars > r1.stars
意味着:返回那些第二次评分并给予更多明星的人。
如果你没有强制执行日期顺序(!=)那么该对的另一个记录(由联接产生的交叉产品)将导致返回Brittany Harris。尝试将两者都设置为!=,您将在不同时间看到所有不同评级的记录对。