2011-05-12 22 views
26

Ho bisogno di eseguire una query Per recuperare i dati da più tabelle ma sono piuttosto confuso su come eseguire tutto in una volta.Più SQL join

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 e Writers_Books sono le tabelle intermedie per aiutarmi a implementare molti a molti relazioni tra le tabelle.

Ho bisogno di un singola query con più giunzioni per selezionare:

  • titolo, edizione, anno, pagine, Valutazione di libri
  • Categoria da Categorie
  • Publisher da Publishers
  • Cognome da scrittori

risposta

99

Sarà qualcosa del genere:

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 

si utilizza l'istruzione join per indicare quali campi da tavolo Una mappa a tavola B. Sto usando pseudonimi qui Ecco perché si vede Books b tavolo Books sarà indicato come b nel resto della query. Questo rende meno digitando.

FYI tua convenzione di denominazione è molto strano, io mi aspetterei che fosse più simile a questo:

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, eh? Perché? –

+6

Hai downvoted una risposta perfettamente valida perché non sei d'accordo con il loro ragionamento? Dovrei downvotare il tuo ragionamento "risposta" in quanto non è una risposta alla domanda? +1. – Jaymz

+2

No, revociamo bene, risposte corrette. – Jaymz

25

si può usare qualcosa di simile:

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

Cool, @kris ha votato anche tu. –

+0

@Josh finchè si diverte;) – krtek

+0

Suona bene, liberiamoci di uno dei principali differenziatori del sito. Vai e pubblicalo su meta.stackoverflow.com, guarda cosa dicono. Sono sicuro che tutti saranno d'accordo con te. – 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