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,很好。有些组合不起作用,可能是分区的,我得到的规则是: