表Movie(Title,year,director,length)
查找标题出现多次(不同年份)的电影
Select Distinct title
From Movie as x
where year <> any
(Select year
from movie
where title = x.title);
我不明白这个sql代码,有谁能解释一下?
答案 0 :(得分:1)
<强> 9.23.3。 ANY / SOME(数组)
表达式运算符ANY(数组表达式) 表达式运算符SOME(数组表达式)
右侧是带括号的表达式,它必须产生一个数组值。计算左侧表达式并使用给定运算符与数组的每个元素进行比较,这必须产生布尔结果。任何结果都是&#34; true&#34;如果获得任何真实结果。结果是&#34; false&#34;如果没有找到真实结果(包括数组中零元素的情况)。
如果数组表达式产生空数组,则ANY的结果将为null。如果左侧表达式产生null,则ANY的结果通常为空(尽管非严格比较运算符可能会产生不同的结果)。此外,如果右侧数组包含任何null元素并且未获得真正的比较结果,则ANY的结果将为null,而不是false(同样,假设使用严格的比较运算符)。这符合SQL的空值布尔组合的常规规则。
某些是ANY的同义词。
所以基本上如果使用数组形成任何谓词,那么整个表达式的计算结果为true:
使用一些示例数据
Title | Year
----------------+--------
Point Break | 1991
The Italian Job | 1969
The Italian Job | 2003
对于意大利工作,你的where子句将是
WHERE Year <> 1969
OR Year <> 2003
对于每条记录,这将评估为真,因为其中一年将每次都不同。对于Point Break,where子句将是
WHERE Year <> 1991
这不会返回true,因此不会返回记录。
因此,您的查询要求提供一个独特的电影片名列表,其中另一部电影以相同的标题和不同的年份存在。
<强> Examples on SQL Fiddle 强>
答案 1 :(得分:1)
让我们谈谈where year <> any
:
子查询将为您提供所有年份出现的标题。对于每一行(title
),请检查是否有任何其他年份显示的标题与当前年份不同<>
。
如果为TRUE,则该标题会出现多次(在不同年份)。归还那个头衔。
如果为FALSE,则该标题只出现一次。
答案 2 :(得分:0)
此查询有帮助吗?
select * from
(select *,
(select count(1)
from movie m2
where m2.title = m.title and m2.year <> m.year) as MovieCount
from movie m) as z
where z.MovieCount > 0
答案 3 :(得分:0)
那一年&lt;&gt;任何(......)根本不能说服我。
作为替代方案,我会使用类似的东西:
SELECT Title
FROM Movie
GROUP BY Title
HAVING COUNT(DISTINCT year)>1