因此,我有一个名为Cast的表,其中包含film_id和number_of_actors。我有一个包含电影name和year.的film表,我需要创建子查询,它将找到哪部电影中的演员数量最少,并输出电影的名称。但是我不能使用joins。
我该怎么做??
到目前为止,我有:
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;我刚接触甲骨文,所以这可能真的是错的。但任何帮助都是最好的。
发布于 2015-04-08 22:24:20
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 )
);发布于 2015-04-09 03:33:07
由于您不能使用joins (摇头晃脑),因此您可以执行以下操作:
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
);请注意,这将返回演员数量最少的所有电影。如果使用ROW_NUMBER()而不是RANK() (或者,也可以使用基于ROWNUM的解决方案),则无论有多少影片的演员数量最少,都只能得到一部影片。
发布于 2015-04-08 22:44:36
下面的代码将执行您想要的操作:
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我们在这里做的是将电影和演员表连接在一起,以允许我们获得电影名称和演员数量,并根据演员数量对连接的数据进行排序,以便首先返回演员数量最少的电影。然后,外层select用于剥离由子查询返回的第一行,结果只有一行包含电影中演员数量最少的演员的姓名和数量。
https://stackoverflow.com/questions/29516649
复制相似问题