oracle查询以查找最大关系
我有一个关于甲骨文的问题oracle查询以查找最大关系,oracle,Oracle,我有一个关于甲骨文的问题 SELECT q2.Director_ID, q2.Actor_ID FROM (SELECT MAX(n.Num_Joint_Movies) AS Max_Joint_Movies FROM (SELECT d.Director_ID, A.Actor_ID, COUNT(*) AS Num_Joint_Movies FROM Movies_Directors AS d , Roles AS a
SELECT q2.Director_ID, q2.Actor_ID
FROM (SELECT MAX(n.Num_Joint_Movies) AS Max_Joint_Movies
FROM (SELECT d.Director_ID, A.Actor_ID, COUNT(*) AS Num_Joint_Movies
FROM Movies_Directors AS d
, Roles AS a
where d.Movie_ID = a.Movie_ID
GROUP BY d.Director_ID, A.Actor_ID
) AS n
) AS q3,
(SELECT d.Director_ID, A.Actor_ID, COUNT(*) AS Num_Joint_Movies
FROM Movies_Directors AS d
, Roles AS a
where d.Movie_ID = a.Movie_ID
GROUP BY d.Director_ID, A.Actor_ID
) AS q2
where q3.Max_Joint_Movies = q2.Num_Joint_Movies
但是我得到了错误ORA-00907:缺少右括号
你能告诉我我做错了什么吗
SELECT Director_ID,
Actor_ID FROM
(SELECT
d.Director_ID,
a.Actor_ID,
COUNT(*) AS Num_Joint_Movies
FROM
Movies_Directors AS d
JOIN Roles AS a
ON d.Movie_ID = a.Movie_ID
GROUP BY
d.Director_ID,
a.Actor_ID
) WHERE ROWNUM = 1 ORDER BY Num_Joint_Movies ASC
/
试试这一个,它应该可以工作您的SQL正在失败,因为您在表联接上使用了as关键字 (你应该有:
SELECT q2.Director_ID, q2.Actor_ID
FROM (SELECT MAX(n.Num_Joint_Movies) AS Max_Joint_Movies
FROM (SELECT d.Director_ID, A.Actor_ID, COUNT(*) AS Num_Joint_Movies
FROM Movies_Directors d
, Roles a
where d.Movie_ID = a.Movie_ID
GROUP BY d.Director_ID, A.Actor_ID
) n
) q3,
(SELECT d.Director_ID, A.Actor_ID, COUNT(*) AS Num_Joint_Movies
FROM Movies_Directors d
, Roles a
where d.Movie_ID = a.Movie_ID
GROUP BY d.Director_ID, A.Actor_ID
) q2
where q3.Max_Joint_Movies = q2.Num_Joint_Movies;
您的SQL可以简化为:
select Director_ID, Actor_ID, Num_Joint_Movies
from (select d.Director_ID, A.Actor_ID, COUNT(*) Num_Joint_Movies,
rank() over (order by count(*) desc) r
from Movies_Directors d
inner join Roles a
on d.Movie_ID = a.Movie_ID
group by d.Director_ID, A.Actor_ID)
where r = 1;
编辑一个小样本:
SQL> create table Movies_Directors(director_id, Movie_ID)
2 as
3 select 1, 1 from dual
4 union all
5 select 1, 2 from dual
6 union all
7 select 2, 3 from dual
8 union all
9 select 2, 4 from dual
10 union all
11 select 3, 1 from dual ;
Table created.
SQL> create table roles(movie_id, actor_Id)
2 as
3 select 1, 1 from dual union all
4 select 1, 2 from dual union all
5 select 1, 3 from dual union all
6 select 1, 4 from dual union all
7 select 2, 1 from dual union all
8 select 2, 3 from dual union all
9 select 3, 3 from dual union all
10 select 3, 1 from dual;
Table created.
如果我们添加秩分析:
SQL>选择d.Director\u ID、A.Actor\u ID、COUNT*Num\u Joint\u Movies、,
2按计数的顺序排列*desc r
3部电影(d)
4个内部连接角色a
5在d.Movie\u ID=a.Movie\u ID上
6组由d.导演ID、A.演员ID组成
七,/
DIRECTOR_ID ACTOR_ID NUM_JOINT_MOVIES R
----------- ---------- ---------------- ----------
1 1 2 1
1 3 2 1
2 3 1 3
1 2 1 3
3 2 1 3
3 3 1 3
3 4 1 3
2 1 1 3
1 4 1 3
3 1 1 3
10 rows selected.
现在只需按排名1进行筛选
SQL> select Director_ID, Actor_ID, Num_Joint_Movies
2 from (select d.Director_ID, A.Actor_ID, COUNT(*) Num_Joint_Movies,
3 rank() over (order by count(*) desc) r
4 from Movies_Directors d
5 inner join Roles a
6 on d.Movie_ID = a.Movie_ID
7 group by d.Director_ID, A.Actor_ID)
8 where r = 1;
DIRECTOR_ID ACTOR_ID NUM_JOINT_MOVIES
----------- ---------- ----------------
1 3 2
1 1 2
与原始更正的sql相比:
SQL>选择q2.Director\u ID,q2.Actor\u ID
2从中选择MAXn.Num_Joint_Movies作为Max_Joint_Movies
3从中选择d.导演ID、A.演员ID,将*计为Num\ U联合\ U电影
4部电影
5、角色a
6其中d.Movie\u ID=a.Movie\u ID
7组由d.导演ID、A.演员ID组成
8N
9第3季度,
10选择d.导演ID、A.演员ID、计数*作为数字电影
11部电影
12、角色a
13其中d.Movie\u ID=a.Movie\u ID
14 d.导演ID、A.演员ID分组
15 q2
16其中q3.Max\u Joint\u Movies=q2.Num\u Joint\u Movies
DIRECTOR_ID ACTOR_ID
----------- ----------
1 1
1 3
SQL>
fiddle请-给我们fiddle link有人能建议一个更好的方法来写这个查询吗…不,它不工作,它给出了相同的错误,这个查询将返回一行,我想要所有主管的记录_id@FlorinGhita是的,这在这种情况下有效,按计数排序*desc.mmmm,很好。有些组合不起作用,可能是分区的,我得到的规则是: