Объединение 3 таблиц, имеющих отношения «один ко многим» и «многие ко многим» в SQL Server - PullRequest
0 голосов
/ 07 декабря 2018

Заранее спасибо, я новичок в проектировании базы данных и запросах. У меня есть 4 таблицы, а именно: film_table, актеры_table, Director_table и продюсер_таблицы следующим образом:

film_table

(film_id, film_name, actor_id, продюсер_id, Director_id)

actor_table (имеет отношение многие ко многим с film_table)

(actor_id, actor_name)

директор_таблицы (имеет отношение много к одному с фильмом_таблицы)

(директор_ид, имя_директора)

продюсер_таблицы (имеет отношение многие к одному с фильмом_таблицы)

(имя_производителя, имя_производителя)

У меня также есть таблица сопоставления в виде:

Actor_Film_Mapping

(actor_id,film_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 голосов
/ 07 декабря 2018

Любые данные об актере в вашем основном film_table, кажется, неуместны, поскольку у вас (правильно) отношения «многие ко многим» между фильмами и актерами, навязанные в вашей таблице соответствия.Я бы пропустил это поле, если оно не служит какой-либо цели, которая не имеет отношения к данному вопросу.

Ваш вопрос, по-видимому, просто требует объединения всех ваших таблиц в различных полях идентификатора.Поскольку фильма для актера много ко многим, ваши результаты для любого данного фильма будут иметь повторы film_name, producer_name и director_name для каждого значения actor_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;
0 голосов
/ 07 декабря 2018

Я не уверен, почему в таблице фильмов есть Actor_id, может быть, это для звезды.

Поскольку у вас есть таблица сопоставления, можно использовать ее, но вам также может понадобиться включить актераиз таблицы фильмов, если они не находятся в таблице отображения

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
...