我的电影桌在这里
title year length incolor studioName producerC#
Avengers 2012 142 1 Marvel 12345
First Avenger 2011 123 1 Marvel 38664
Justice League 2017 121 1 DC 11223
Man of Steel 1925 142 1 DC 38664
Man of Steel 2013 142 1 DC 11223
Ted 2012 106 1 Universal 87654
Toy Story 3 2010 102 1 Pixar 23456
我想找到“已用于两部或更多电影的标题。”
答案是“钢铁侠”,因为这部电影的年份是1925年,2013年,所以用了两次。
我的查询在这里。
select distinct movie.title
from movie, (select * from movie) as temp
where temp.title = movie.title
AND (temp.year != movie.year OR temp.length != movie.length OR temp.studioName != movie.studioName);
从长远来看,结果是Man of Steel
我想要的。
但我不了解电影的温度差异。
两个表的值完全相同,因此temp.title = movie.title
应该是select title from movie;
和temp.year != movie.year
应该为空,因为temp.year != movie.year
与select year from movie where movie.year != movie.year
相同
但是结果是“钢铁侠”,我不明白自己错过了什么。
答案 0 :(得分:3)
您当前的查询不理想。您应该使用显式联接重写它,在这种情况下,应使用显式自联接:
SELECT DISTINCT
m1.title
FROM movie m1
INNER JOIN movie m2
ON m1.title = m2.title
WHERE
m1.year <> m2.year OR m1.length <> m2.length OR m1.studioName <> m2.studioName;
这里的逻辑是考虑每对拥有相同标题的电影,但不共享年份,长度或工作室名称。也就是说,找到所有电影标题,以使另一部电影具有相同的标题,但是其他一个或多个字段不同。
还有另一种使用按电影标题聚合的查询来编写查询的方法:
SELECT title
FROM movie
GROUP BY title
HAVING
MIN(year) <> MAX(year) OR
MIN(length) <> MAX(length) OR
MIN(studioName) <> MAX(studioName);
答案 1 :(得分:2)
在您的查询中,“温度”和“电影”都是完全相同的表,并且用其他术语SELF JOIN
进行联接的目的是匹配两个电影标题,而另一个特征中的至少一个不同则可以是“年份”,长度或工作室名称。这就是为什么在WHERE
语句中以OR
条件给出不相等的符号的原因。