2013-04-04 7 views
0

это мой первый пост здесь. Я создаю базу данных SQL с помощью следующей реляционной схемыSQL Inner Join 3 таблицы


АВТОР (AUTHOR_ID,, AUTHOR_NAMEВы Author_Address)

ВЕБСАЙТОВ (Website_ID, Web_Name, Server_Capacity, ISP)

COMIC (Comic_ID, Comic_Name , Comic_Date, author_id, Website_ID)

FK Author_ID → AUTHOR (not Null), (not Unique) 
       Delete: C, Update: C 

FK Website_ID → WEBSITE (not Null), (not Unique) 
       Delete: C, Update: C 

ПРОБЛЕМА (ISSUE_ID, Issue_Name, Issue_Date, Comic_ID)

FK Comic_ID → COMIC (not Null), (not Unique) 
      Delete: C, Update: C 

PRODUCT (PRODUCT_ID, Product_Name, Product_Cost, Comic_ID, VENDOR_ID)

FK Comic_ID → COMIC (не Null), (не уникальный) Удалить: C, Update: C

FK Vendor_ID → VENDOR (not Null), (not Unique) 
         Delete: C, Update: C 

ПОСТАВЩИК (VENDOR_ID, VENDOR_NAME, Vendor_Address, Website_ID)

FK Website_ID → WEBSITE (Null), (not Unique) 
        Delete: N, Update: C 

КОНТРАКТ (Contract_ID, Contract_Date, А uthor_ID, VENDOR_ID)

FK Author_ID → AUTHOR (not Null), (not Unique) 
       Delete: C, Update: C 

FK Vendor_ID → VENDOR (not Null), (not Unique) 
        Delete: C, Update: C 

Я знаю, что это много, но есть конкретный вопрос здесь; Мне нужно создать несколько запросов, которые объединяют таблицы INNER JOIN 3. Прямо сейчас, это одна из ситуаций запроса, которые я создал.

«Перечислите имя каждого сайта, на котором размещены как комикса и Vendor» , к которому я написал следующий запрос:


ВЫБРАТЬ Web_Name с веб-сайта

INNER JOIN Comic на веб-сайте. Веб-сайт_ID = Comic.Website_ID

INNER JOIN Поставщик на сайте.Website_ID = поставщик.Website_ID;


Правильно ли этот запрос использует INNER JOIN для 3 таблиц? если вместо этого ситуация с запросом должна быть «перечислить имя каждого комика и поставщика, который имеет общий сайт?» Я немного потерян, когда дело доходит до Inner и Outer Joins, поэтому у меня проблемы с запросами, которые их привлекают.

Спасибо за ваше время.

ответ

2

У меня недостаточно репутации, чтобы комментировать, поэтому я отвечу на этот вопрос. :)

Образец запроса, который вы дали, вернет каждый веб-сайт, к которому привязаны как комикс, так и поставщик.

Этот сайт помог мне получить тонну, когда я изучал надлежащую технику соединения. Мне нравится визуализировать вещи.http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html

0

Ваш запрос будет возвращать каждый сайт с комиком и поставщиком. , , но несколько раз. Один из способов исправить это добавить distinct:

SELECT distinct w.Web_Name 
FROM Website w INNER JOIN 
    Comic c 
    on w.Website_ID = c.Website_ID inner join 
    Vendor v 
    on w.Website_ID = w.Website_ID; 

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

Есть альтернативные способы сделать это. Вот один из способов:

select w.WebName 
from Website w 
where w.Website_Id in (select WebSite_Id from Comics) and 
     w.Website_In in (select WebSite_Id from Vendor) 

Это говорит: принеси мне все Webnames, где веб-сайт в список сайтов, которые имеют комический и список сайтов, которые имеют поставщика.