SQL访问-仅限子查询

SQL访问-仅限子查询,sql,ms-access,limit,Sql,Ms Access,Limit,我正试图从电影数据库中获取一份特定导演合作过的演员名单,以及这些演员参与过的电影名单 SELECT DISTINCT A_First_Name, A_Last_Name, Film_Title FROM (SELECT * FROM Actor, Film, Film_Actor_Director_Genre WHERE Actor.AID=Film_Actor_Director_Genre.AID AND Film.FID=Film_Actor_Director_Genr

我正试图从电影数据库中获取一份特定导演合作过的演员名单,以及这些演员参与过的电影名单

SELECT DISTINCT A_First_Name, A_Last_Name, Film_Title
FROM 

  (SELECT * 
  FROM Actor, Film, Film_Actor_Director_Genre
  WHERE Actor.AID=Film_Actor_Director_Genre.AID
  AND Film.FID=Film_Actor_Director_Genre.FID)

WHERE A_First_Name IN 

  (SELECT A_First_Name
  FROM 

    (SELECT * 
    FROM Actor, Director, 
    Film_Actor_Director_Genre
    WHERE 
    Actor.AID=Film_Actor_Director_Genre.AID
    AND 
    Director.DID=Film_Actor_Director_Genre.DID)

  WHERE D_First_Name=[Director’s first name?]
  OR D_Last_Name=[Director’s last name?]);
假设我想知道导演D01合作过的演员名单,示例结果如下:

Actor    Film
-----    ----
A01      F01
A01      F02
A01      F03
A01      F04
A02      F01
A02      F02
A02      F05
A02      F06
A03      F01
A04      F01
A04      F02
A04      F09
A05      F01
A05      F02
A06      F10
A07      F01
A07      F02
A07      F04
etc.     etc.
然而,由于D01合作过的演员名单可能非常长,我只想展示排名前5位的演员,即与D01合作过的大多数电影中的演员,以及演员参与过的所有电影。所以我只想限制演员,不想限制电影。预期的结果将是:

Actor    Film
-----    ----
A01      F01
A01      F02
A01      F03
A01      F04
A02      F01
A02      F02
A02      F05
A02      F06
A04      F01
A04      F02
A04      F09
A05      F01
A05      F02
A07      F01
A07      F02
A07      F04
我试图在各种子查询中实现SELECT DISTINCT TOP 5语法,但它们返回了5个结果的奇怪组合,例如

Actor    Film
-----    ----
A01      F01
A01      F02
A02      F01
A02      F02
A06      F10

我如何限制结果只显示与D01合作过的前5名演员以及这些演员参与过的所有电影?谢谢你的时间,如果能得到任何帮助,我将不胜感激

我想这样做会奏效的

select
  *
from
  actors a

  inner join film_actor_director_genre fadg on 
    on fadg.aid = a.aid

  inner join film f on
    f.fid = fadg.fid

  -- This should return all actors that have been in 
  -- at lead 5 movies with a director. Note the count
  -- ordering and limit
  inner join (
    select top 5
      a.aid
    from
      film_actor_director_genre
    group by
      a.aid,
      d.did
    having
      count(*) >= 5
    order by
      count(*)
  ) t1 on
    t1.aid = a.aid
如果out无法测试查询,则有点棘手。应该有用

这是访问权限

假设他的查询是正确的,您可以用更简单的内容替换limit和having:

 select top 5 aid, count(*) as qty from film_actor_director_genre group by aid, did order by 2 desc
如果access无法处理ORDERBY子句,则可以将其切换回

 select top 5 aid, count(*) as qty from film_actor_director_genre group by aid, did order by count(*) desc

这是一个相当简单的查询,但我对您试图实现的目标有点困惑。你是不是想列出在大多数电影中只有一位导演的演员?但是你不想展示导演,只想展示他们演过的演员和电影?是的,你是对的。我将编辑我的问题以澄清这一点。请给我一点时间来写下这个问题:我认为Access无法识别限制语法…而且我似乎无法实现这一点,尝试将连接语法编辑为“无可用”。Access似乎不喜欢限制您是对的。它似乎更喜欢我的谷歌搜索中的top。检查编辑的版本。。不确定是否有效,但可能有效。谢谢!只是想添加Access中的连接函数需要括号,所以我必须添加:Actor A internal join Film\u Actor\u Director\u general FADG on FADG.AID=A.AID internal join Film F on F.FID=FADG.FID internal join SELECT TOP 5 AID,COUNT*AS[from FADG]GROUP BY AID,dod BY COUNT*DESC t1 on t1.AID=A.AID,但除此之外它是有效的。干杯感谢您对order子句的帮助,使用了它,它确实起了作用。