相关的电影子查询

时间:2014-04-29 15:50:49

标签: sql

Movie(Title,year,director,length)

查找标题出现多次(不同年份)的电影

Select Distinct title 
From Movie as x
where year <> any
              (Select year 
               from movie
               where title = x.title);

我不明白这个sql代码,有谁能解释一下?

4 个答案:

答案 0 :(得分:1)

From the docs

<强> 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),请检查是否有任何其他年份显示的标题与当前年份不同<>

  1. 如果为TRUE,则该标题会出现多次(在不同年份)。归还那个头衔。

  2. 如果为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