2017-12-04 21 views
0

私は以下のDBを持っています。これは、メンバーが貸し出した著者のファーストネームを取得する適切なクエリですか?またはより効率的な方法がありますか?複数のテーブルを照会する方法

select M.MemberNo, A.FirstName 
from Person.Members as M 
INNER JOIN Booking.Loans as L 
on M.MemberNo = L.MemberNo 
INNER JOIN Article.Copies as C 
on L.ISBN = C.ISBN and L.CopyNo = C.CopyNo 
INNER JOIN Article.Items as I 
on C.ISBN = I.ISBN 
INNER JOIN Article.Titles as T 
on I.TitleID = T.TitleID 
INNER JOIN Article.TitleAuthors as TA 
on T.TitleID = TA.TitleID 
INNER JOIN Article.Authors as A 
on TA.AuthorID = A.AuthorID 
; 
go 

enter image description here

+0

小さな画像のテキストを読み取ることができません... – jarlh

+0

@jarlh画像をクリックしてテキストを正しく表示できるはずです – neilnm

答えて

1

このようなものだメンバーに貸し出され、書籍の著者の名前を取得するための最も直接的な方法:

  1. ゲット会員ローン(Booking.Loans)
  2. メンバーローンの書籍を入手する(記事.Items)
  3. メンバーローンの書籍を入手する(Article.TitleAuthors)
select L.MemberNo, A.FirstName 
FROM Booking.Loans as L 
INNER JOIN Article.Items as I 
on L.ISBN = I.ISBN 
INNER JOIN Article.TitleAuthors as TA 
on I.TitleID = TA.TitleID 
INNER JOIN Article.Authors as A 
on TA.AuthorID = A.AuthorID 

あなたが元のクエリを持っているように、すべてのテーブルを結合する利点は、各仲介することを確実にするためである(Article.Authors)メンバーローンの書籍の著者のための最初の名前を取得します。テーブルがINSERTまたはDELETEされました。

たとえば、元のクエリでは、ローン(ローンテーブルの行)があって何らかの理由でメンバーテーブルにエントリがない場合、メンバーの行は返されません。 Loansテーブルに行がある場合、メンバーテーブルに常に行が存在すると見なすことができます(または気にしない)場合は、Person.Membersへの参加を除外できます。

必要に応じて、この同じロジックを他の中間テーブル(メンバー、コピー、タイトル)にも適用できます。ただし、これらのテーブルのいずれかから特定のデータが必要な場合は、それらを結合に含める必要があります。

+0

はい、意味が分かりませんが、なぜ私はそれを考えなかったのですか?メンバーのファーストネームが必要な場合は、元のクエリが正しく必要ですか? – neilnm

+0

右のように、メンバーテーブルへの参加を含めるだけで済みます。 – ravioli

関連する問題