在SQL Server中联接3个具有一对多和多对多关系的表

时间:2018-12-07 16:10:50

标签: sql-server database join

预先感谢,我是数据库设计和查询的新手 我有4个表,分别是film_table,actors_table,director_table和producer_table,如下所示:

film_table

(电影ID,电影名称,演员ID,制片人ID,导演ID)

actor_table (与film_table有很多关系)

(actor_id,actor_name)

director_table (与film_table有多对一关系)

((导演__id,导演名称)

producer_table (与film_table有多对一关系)

(生产者ID,生产者名称)

我也有一个格式如下的映射表:

Actor_Film_Mapping

(演员ID,电影ID)

我需要查询数据库以获取以下格式的数据:

(电影名称,演员名称,制片人名称,导演名称)

我尝试了以下查询:

SELECT f.film_name       
FROM Film_table f
INNER JOIN Actor_table a
on f.actor_id= a.actor_id
INNER JOIN Actor_Film_Mapping afm
on a.actor_id = afm.actor_id;

2 个答案:

答案 0 :(得分:0)

我不确定影片表中为什么有一个Actor_id,也许是为了明星。

由于您具有可以使用的映射表,但是如果它们不在映射表中,则可能还需要包括电影表中的actor

SELECT f.film_name, a.actor_name       
FROM Film_table f
INNER JOIN Actor_Film_Mapping afm
on f.film_id = afm.film_id;
INNER JOIN Actor_table a
on afm.actor_id= a.actor_id

答案 1 :(得分:0)

您的主要film_table中的任何演员数据似乎都不合适,因为您(正确)在映射表中强制执行的电影与演员之间存在多对多关系。我会删除该字段,除非它具有与此处的问题无关的目的。

您的问题似乎只需要将所有表放在不同的ID字段上即可。由于电影对演员是多对多的,因此对于任何给定电影,您的结果将对每个film_name的值重复producer_namedirector_nameactor_name ,但此查询将为您提供建议的答案所需的所有数据点:

SELECT 
  f.film_name,
  a.actor_name,
  p.producer_name,
  d.director_name
FROM
  film_table AS f
  JOIN
    Actor_Film_Mapping AS afm
      ON afm.actor_id = f.film_id
  JOIN
    actor_table AS a 
      ON a.actor_id = afm.actor_id
  JOIN
    producer_table AS p 
      ON p.producer_id = f.producer_id
  JOIN
    director_table AS d
      ON d.director__id = f.director__id;