如何用最少量的演员Oracle找到这部电影

时间:2015-04-08 13:52:10

标签: oracle subquery

所以我有一个名为Cast的表格,其中包含film_idnumber_of_actors。我有一张film表格,其中包含name电影和year.我需要创建一个子查询,找出哪部电影的主演者数量最少,并输出名称电影。我不能使用连接。

我该怎么做?

到目前为止,我有:

 SELECT c.number_of_actors, count(*), f.name
   FROM cast c, film f
  where f.id = (SELECT min(c.number_of_Actors)
   from cast
  group by number_of_Actors;

我是ORACLE的新手,所以这可能是错的。但任何帮助都会很棒。

3 个答案:

答案 0 :(得分:1)

WITH ranked_cast_sizes AS (
  SELECT film_id,
         RANK() OVER ( ORDER BY number_of_actors ASC ) AS cast_size_rank
  FROM   cast
)
SELECT f.name
FROM   film f
       INNER JOIN
       ranked_cast_sizes r
       ON ( f.id = r.film_id )
WHERE  r.cast_size_rank = 1;

或者没有连接的不同方式:

SELECT f.name
FROM   film f
WHERE  EXISTS ( SELECT 'X'
                FROM   cast c
                WHERE  f.id = c.film_id
                AND    c.number_of_actors = ( SELECT MIN( number_of_actors)
                                              FROM   cast )
              );

答案 1 :(得分:1)

由于您无法使用联接(摇头),您可能会执行以下操作:

SELECT name, year
  FROM film
 WHERE id IN (
    SELECT film_id FROM (
        SELECT film_id, RANK() OVER ( ORDER BY number_of_actors ) AS rn
          FROM cast
    ) WHERE rn = 1
);

请注意,这将返回具有最少actor数的所有影片。如果您使用ROW_NUMBER()而不是RANK()(或者,基于ROWNUM的解决方案),您将只获得一部电影,无论有多少电影的最小数量为演员。

答案 2 :(得分:0)

以下将做你想做的事:

SELECT *
  FROM (SELECT f.NAME, c.NUMBER_OF_ACTORS
          FROM FILM f
          INNER JOIN CAST c
            ON c.FILM_ID = f.ID
          ORDER BY c.NUMBER_OF_ACTORS)
  WHERE ROWNUM = 1

我们在这里做的是将FILM和CAST表连接在一起,以便我们获取电影名称和演员数量,按演员数量排序连接数据,以便首先返回最少演员的电影。然后外部选择用于剥离子查询返回的第一行,导致只有一行具有最少演员的电影中演员的姓名和数量。