所以我有一个名为Cast
的表格,其中包含film_id
和number_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的新手,所以这可能是错的。但任何帮助都会很棒。
答案 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表连接在一起,以便我们获取电影名称和演员数量,按演员数量排序连接数据,以便首先返回最少演员的电影。然后外部选择用于剥离子查询返回的第一行,导致只有一行具有最少演员的电影中演员的姓名和数量。