2011-05-12 2 views
26

Мне нужно выполнить запрос Извлечь данные из нескольких таблиц, но я довольно запутался в том, как сделать это все сразу.Несколько SQL-соединений

Books: _ISBN , BookTitle, Edition, Year, PublisherID, Pages, Rating 
Categories: _CategoryID, Category 
Categories_Books: _Categories_Category_ID, _Books_ISBN 
Publishers: _Publisherid, Publisher 
Writers: _WriterID, LastName 
Writers_Books: _Writers_WriterID, _Books_ISBN 

Categories_Books и Writers_Books являются промежуточные таблицы, чтобы помочь мне реализовать многие ко многим отношений между таблицами.

Мне нужен один запрос с несколькими присоединяется для выбора:

  • названия, издание, год, страница, рейтинг из Книги
  • Категории из Категории
  • Издатель от издательства
  • LastName из писателей

ответ

99

Это будет примерно так:

SELECT b.Title, b.Edition, b.Year, b.Pages, b.Rating, c.Category, p.Publisher, w.LastName 
FROM 
    Books b 
    JOIN Categories_Book cb ON cb._ISBN = b._Books_ISBN 
    JOIN Category c ON c._CategoryID = cb._Categories_Category_ID 
    JOIN Publishers p ON p._PublisherID = b.PublisherID 
    JOIN Writers_Books wb ON wb._Books_ISBN = b._ISBN 
    JOIN Writer w ON w._WritersID = wb._Writers_WriterID 

Вы используете join заявление, чтобы указать, какие поля из таблицы карты в таблице В. Я использую псевдонимы здесь Вот почему вы видите Books b таблица Books будет называться b в остальной части запроса. Это приводит к меньшему набору текста.

FYI ваше именовании очень странно, я бы ожидать, что это будет больше похоже на это:

Book: ID, ISBN , BookTitle, Edition, Year, PublisherID, Pages, Rating 
Category: ID, [Name] 
BookCategory: ID, CategoryID, BookID 
Publisher: ID, [Name] 
Writer: ID, LastName 
BookWriter: ID, WriterID, BookID 
+2

Downvote, да? Зачем? –

+6

Вы проигнорировали отличный ответ, потому что не согласны с их рассуждениями? Должен ли я понизить ваш аргумент «ответ», поскольку это не ответ на вопрос? +1. – Jaymz

+2

Нет, мы поддерживаем хорошие, правильные ответы. – Jaymz

25

Вы можете использовать что-то вроде этого:

SELECT 
    Books.BookTitle, 
    Books.Edition, 
    Books.Year, 
    Books.Pages, 
    Books.Rating, 
    Categories.Category, 
    Publishers.Publisher, 
    Writers.LastName 
FROM Books 
INNER JOIN Categories_Books ON Categories_Books._Books_ISBN = Books._ISBN 
INNER JOIN Categories ON Categories._CategoryID = Categories_Books._Categories_Category_ID 
INNER JOIN Publishers ON Publishers._Publisherid = Books.PublisherID 
INNER JOIN Writers_Books ON Writers_Books._Books_ISBN = Books._ISBN 
INNER JOIN Writers ON Writers.Writers_Books = _Writers_WriterID. 
+0

Прохладный, @kris тоже проголосовал. –

+0

@ Josh, пока он развлекается;) – krtek

+0

Звучит неплохо, давайте избавимся от одного из главных отличий сайта. Идите и опубликуйте его на meta.stackoverflow.com, посмотрите, что они говорят. Я уверен, что с вами все согласятся. – Jaymz

2
SELECT 
B.Title, B.Edition, B.Year, B.Pages, B.Rating  --from Books 
, C.Category          --from Categories 
, P.Publisher          --from Publishers 
, W.LastName          --from Writers 

FROM Books B 

JOIN Categories_Books CB ON B._ISBN = CB._Books_ISBN 
JOIN Categories_Books CB ON CB.__Categories_Category_ID = C._CategoryID 
JOIN Publishers P ON B.PublisherID = P._Publisherid 
JOIN Writers_Books WB ON B._ISBN = WB._Books_ISBN 
JOIN Writers W ON WB._Writers_WriterID = W._WriterID 
Смежные вопросы