2016-07-08 7 views
0

У меня есть 2 объекта; castfilm и сотрудников в моем erd, которые имеют общий атрибут employeeid. Теперь я хотел, чтобы Query в postgre отображал атрибуты, относящиеся к конкретному человеку, у которого есть employeeid no. 307 где его имя и имя - Давид и Кай соответственно.PostgreSQL, соединяющий две таблицы с двумя общими атрибутами по запросу

Мой ERD выглядит следующим образом: enter image description here

атрибуты, которые я хотел показать это Fname, LNAME, castrole, filmtitle, filmgenre, filmyear, НазваниеКомпании, staffposition, artistname и soundtitle, которые связаны с пленкой из сотрудник по имени Дэвид Кэй

Вот мой запрос:

SELECT distinct fname,lname,castrole, filmtitle, filmgenre, filmyear, companyname 
FROM employee, 
    castfilm, 
    film, 
    production, 
    company 
WHERE employee.employeeid = 307 
    AND employee.employeeid = castfilm.employeeid 
    AND castfilm.filmid = film.filmid 
    AND production.companyid = company.companyid 
    AND production.filmid = film.filmid 

[выход] [2]

Как показать другие персонажи и роли, связанные с конкретным фильмом, на котором работает Дэвид Кей?

+1

Советы сегодня: перейти к современной, явного 'JOIN' синтаксиса! (Легче писать - без ошибок, проще читать и поддерживать, а проще конвертировать в внешнее соединение, если это необходимо.) – jarlh

ответ

0

Вы можете использовать EXISTS заявление:

Аргумент EXISTS является произвольным ЗЕЬЕСТ, или подзапрос. Подзапрос оценивается для определения того, возвращает ли он любые строки. Если возвращает хотя бы одну строку, результатом EXISTS является «true»; если подзапрос не возвращает строк, результатом EXISTS является «false».

В подзапроса вы должны проверить, если для данного filmid существует в castfilm в employeeid. И это employeeid должно быть 307.

Как это:

SELECT distinct fname,lname,castrole, filmtitle, filmgenre, filmyear, companyname 
FROM employee, 
    castfilm, 
    film, 
    production, 
    company 
WHERE employee.employeeid = castfilm.employeeid 
    AND castfilm.filmid = film.filmid 
    AND production.companyid = company.companyid 
    AND production.filmid = film.filmid 
    AND EXISTS (
    SELECT 
     employeeid 
    FROM 
     castfilm 
    WHERE 
     filmid = film.filmid AND 
     employeeid = 307 
    ); 

Пожалуйста, обратите внимание, что film.filmid используется в подзапрос.

Кроме того, как отметил @jarlh, вы могли бы использовать JOIN синтаксис, например:

SELECT 
    fname, 
    lname, 
    castrole, 
    filmtitle, 
    filmgenre, 
    filmyear, 
    companyname 
FROM 
    employee 
    JOIN castfilm 
    ON (employee.employeeid = castfilm.employeeid) 
    JOIN film 
    ON (castfilm.filmid = film.filmid) 
    JOIN production 
    ON (film.filmid = production.filmid) 
    JOIN company 
    ON (production.companyid = company.companyid) 
WHERE 
    EXISTS (
     SELECT 
      employeeid 
     FROM 
      castfilm 
     WHERE 
      filmid = film.filmid AND 
      employeeid = 307 
    ); 
+0

Похоже, это был бы хороший кандидат для NATURAL JOINs. Это может помочь еще более упростить логику. – Feneric

+0

tnx для ответа, но pic моего erd did not работает, но я исправил его сейчас, я имею в виду, чтобы на самом деле показать штат сотрудника сотрудника. Более подробная информация о нем - – maggotypeach

+0

. Я имею в виду фактически показать штатное положение сотрудника как хорошо ... вещь моя атрибут staffposition не может иметь никакой ценности вообще для ex. «Дэвид Кэй - это актерский состав, который означает, что он играет роль капрала, но у него нет штатного состава, потому что он не режиссер или писатель». однако в тех случаях, когда работник может иметь как кастрированный, так и штатный состав. поэтому я собираюсь показать строки, основанные на david kaye, которые имеют (fname, lname, castrole, filmtitle, filmgenre, filmyear, companyname, staffposition, artistname и soundtitle) – maggotypeach

Смежные вопросы