SQL选择多对多表

时间:2013-09-17 21:39:23

标签: sql sql-server

我有3张桌子:MoviesActorsMovieActorsMovieActorsMoviesActorsMovieActorIdMovieIdActorId

列的多对多关系

如何查找包含特定演员集的电影?例如,我想找到所有同时拥有Michael Fassbender(演员Id 1)和Brad Pitt(演员Id 2)的电影。查询会是什么样的?

3 个答案:

答案 0 :(得分:5)

一种方法是加入表格。过滤演员,然后确保计数中有你想要的演员数量(在这种情况下为2)

SELECT 
   m.MovieID
FROM
    Movies m
    INNER JOIN MovieActors ma
    ON m.MovieID = ma.MovieID

WHERE
    ma.ActorID IN (1,2)
GROUP BY 
   m.MovieID
HAVING COUNT(DISTINCT ma.ActorID) = 2 

DEMO

注意

感谢user814064指出,因为演员可以在电影上拥有多个角色,我们需要计算DISTINCT ma.ActorID而不只是* SQL小提琴演示演示差异

答案 1 :(得分:2)

select m.movieid
from movies m
inner join movieactors ma on ma.movieid = m.movieid
where ma.actorid in (1,2)
group by m.movieid
having count(distinct ma.actorid) = 2

答案 2 :(得分:1)

为了简单起见,您只需执行两个in子句:

select * from Movies m
where m.MovieId in (select MovieId from MovieActors where ActorId = 1)
and m.MovieId in (select MovieId from MovieActors where ActorId = 2)

性能可能不如单join那么好,但它干净且易于阅读。