2017-10-05 2 views
1

私の質問が質問に何を求めているのか正確にはわかりません。私は間違った質問を理解しているか、質問が何を求めているのか混乱しています。しかし、私が質問から得ていることは、チェックアウトしているメンバー全員のメンバーID、ファーストネーム、ラストネーム、または過去に「ハリー・ポッター」のチェックアウトをしていることです。私の質問が何をしているのかわからない場合

一覧タイトルに「ハリー・ポッター」で、ライブラリのいずれかで、現在または過去のすべての書籍を借りてきたメンバーのMEMBERID、ファーストネーム、および姓:ここ

は疑問です。そのような書籍の中に複数のコピーがある場合、その書籍の少なくとも1つのコピーを借りたことがあります。

コード:

CREATE TABLE Book 
    (bookID INT, 
    ISBN INT, 
    title varchar (60), 
    author varchar (20), 
    publish_year INT, 
    category varchar(20), 
    PRIMARY KEY (bookID)); 

CREATE TABLE Member 
    (memberID INT, 
    lastname varchar (20), 
    firstname varchar (20), 
    address varchar(20), 
    phone_number INT, 
    limit_ INT, 
    PRIMARY KEY (memberID)); 

CREATE TABLE CurrentLoan 
    (memberID INT , 
    bookID INT, 
    loan_date DATE, 
    due_date DATE, 
    PRIMARY KEY (memberID, bookID), 
    FOREIGN KEY (memberID) REFERENCES Member(memberID), 
    FOREIGN KEY (bookID) REFERENCES Book(bookID)); 

CREATE TABLE History 
    (memberID INT, 
    bookID INT, 
    loan_date DATE, 
    return_date DATE, 
    PRIMARY KEY (memberID, bookID, loan_date), 
    FOREIGN KEY (memberID) REFERENCES Member(memberID), 
    FOREIGN KEY (bookID) REFERENCES Book(bookID)); 

INSERT INTO Book VALUES (10, 7771452369, 'XML and XQuery', 'Author Le', 2017, 'reference'); 
INSERT INTO Book VALUES (11, 8881245525, 'XQuery: The XML Query Language', 'Jack Se', 2017, 'reference'); 
INSERT INTO Book VALUES (12, 9991123546, 'Yellow Bird', 'Jake Red', 2014, 'reference'); 
INSERT INTO BOOK VALUES (13, 1212121212, 'The Giving Tree', 'Shel Silverstein', 1964, 'fiction'); 
INSERT INTO BOOK VALUES (14, 2121212121, 'Gone Fishing', 'Shel Silverstein', 1964, 'reference'); 
INSERT INTO BOOK VALUES (15, 1313131313, 'The Lazy Dog', 'Jake Red', 2016, 'childrens'); 
INSERT INTO BOOK VALUES (16, 3131313131, 'The Red Bird', 'Jake Red', 2016, 'childrens'); 
INSERT INTO BOOK VALUES (17, 1414141414, 'The Very Blue Boy', 'Ben Jen', 2006, 'fiction'); 
INSERT INTO Book VALUES (18, 1113312336, 'Harry Potter 1', 'J. K. Rowling', 2000, 'fiction'); 
Insert INTO Book VALUES (19, 1113331142, 'Harry Potter 1', 'J. K. Rowling', 2000, 'fiction'); 
INSERT INTO Book VALUES (20, 2221257787, 'The Real Harry Potter 2', 'J. K. Rowling', 2009, 'fiction'); 
INSERT INTO Book VALUES (21, 2221254896, 'The Fake Harry Potter 3', 'J. K. Rowling', 2010, 'fiction'); 
INSERT INTO Book VALUES (22, 2221254896, 'The Fake Harry Potter 3', 'J. K. Rowling', 2010, 'fiction'); 

INSERT INTO Member VALUES (001, 'Lee', 'Nancy', 'Brownlea Drive', 1254896325, 10); 
INSERT INTO Member VALUES (002, 'Le', 'Ray', '10th Street', 1234561256, 2); 
INSERT INTO Member VALUES (003, 'Kan', 'Charlie', '5th Street', 1234567236, 8); 
INSERT INTO Member VALUES (004, 'Brown', 'Joe', 'Elm Street', 1234567845, 9); 
INSERT INTO Member VALUES (005, 'Smith', 'John', '33 East', 1234567890, 3); 
INSERT INTO Member VALUES (006, 'Kope', 'NON', '358 spence', 2145345625, 5); 

INSERT INTO CurrentLoan VALUES (001, 10, '13-SEP-17', '14-NOV-17'); 
INSERT INTO CurrentLoan VALUES (001, 11, '13-SEP-17', '14-NOV-17'); 
INSERT INTO CurrentLoan VALUES (001, 18, '13-SEP-17', '14-NOV-17'); 
INSERT INTO CurrentLoan VALUES (001, 19, '13-SEP-17', '14-NOV-17'); 
INSERT INTO CurrentLoan VALUES (001, 21, '13-SEP-17', '14-NOV-17'); 
INSERT INTO CurrentLoan VALUES (001, 22, '13-SEP-17', '14-NOV-17'); 
INSERT INTO CurrentLoan VALUES (002, 11, '14-FEB-17', '12-MAR-17'); 
INSERT INTO CurrentLoan VALUES (003, 19, '12-OCT-17', '09-NOV-17'); 
INSERT INTO CurrentLoan VALUES (004, 13, '12-OCT-17', '09-NOV-17'); 
INSERT INTO CurrentLoan VALUES (004, 17, '12-OCT-17', '09-NOV-17'); 

INSERT INTO History VALUES (001, 15, '03-JAN-16', '25-MAY-16'); 
INSERT INTO History VALUES (001, 21, '03-JAN-16', '25-MAY-16'); 
INSERT INTO History VALUES (002, 21, '03-JAN-16', '25-MAY-16'); 
INSERT INTO History VALUES (002, 18, '03-JAN-16', '25-MAY-16'); 
INSERT INTO History VALUES (002, 15, '03-JAN-16', '25-MAY-16'); 
INSERT INTO History VALUES (002, 10, '03-JAN-16', '25-MAY-16'); 
INSERT INTO History VALUES (003, 10, '12-FEB-16', '05-MAY-16'); 
INSERT INTO History VALUES (004, 13, '12-JUN-16', '05-AUG-16'); 
COMMIT; 

問合せ:

SELECT memberID, firstname, lastname 
FROM (SELECT Member.memberID, firstname, lastname 
     FROM Member, Book, CurrentLoan 
     WHERE Member.memberID = CurrentLoan.memberID 
     AND Book.bookID = CurrentLoan.bookID 
     AND Book.title LIKE '%Harry Potter%') 
UNION 
SELECT memberID, firstname, lastname 
FROM (SELECT Member.memberID, firstname, lastname 
     FROM Member, Book, History 
     WHERE Member.memberID = History.memberID 
     AND Book.bookID = History.bookID 
     AND Book.title LIKE '%Harry Potter%'); 
+2

今日のヒント:モダンで明示的な 'JOIN'構文に切り替える - 簡単に(エラーなしに)読みやすく、必要に応じて外部結合に変換しやすくなりました。 – jarlh

+0

上記のデータが正しい場合、そして*すべての* HP書籍を借りたメンバーを見つけることであれば、誰も "The Real Harry Potter 2"を借りていないので、結果セットは空になります。 –

+0

JOIN構文は、ANSI SQL '92標準の一部として追加されました... "19922"のように。 25年ほど経ちましたので、使用開始時期です。 – Aaron

答えて

2

あなたのコードが正しい答えを提供するという点では、正しいです。しかし明示的なJOINのステートメントは優れており、誤解を少なくします。また、あなたはすべての3冊の異なるHPの本を借りてきたメンバーのみを探している場合は、次のクエリは1である

SELECT 
    Member.memberID AS MemberID 
    , Member.firstname AS FirstName 
    , Member.lastname AS LastName 
FROM 
    Member 
     INNER JOIN 
      CurrentLoan ON CurrentLoan.memberID = Member.memberID 
     INNER JOIN 
      Book ON CurrentLoan.bookID = Book.bookID 
      AND Book.title LIKE '%Harry Potter%' 
UNION SELECT 
     Member.memberID 
    , Member.firstname 
    , Member.lastname 
FROM 
    Member 
     INNER JOIN 
      History ON History.memberID = Member.memberID 
     INNER JOIN 
      Book ON History.bookID = Book.bookID 
      AND Book.title LIKE '%Harry Potter%'; 

UPDATE

... INSERT ALLoracle構築物に

を見ますあなたは欲しい。既存のデータを使用すると、結果がまったく得られないことに注意してください。カウントを 2に変更して、少なくとも2冊の本をシリーズで読んだメンバーを探してください。

SELECT 
     MemberID 
    , FirstName 
    , LastName 
FROM (
    SELECT 
      m.memberID AS MemberID 
     , m.firstname AS FirstName 
     , m.lastname AS LastName 
     , b.Title AS BookTitle 
    FROM 
     Member m 
      INNER JOIN CurrentLoan c ON c.memberID = m.memberID 
      INNER JOIN Book b ON c.bookID = b.bookID 
       AND b.title LIKE '%Harry Potter%' 
    UNION SELECT 
      m.memberID 
     , m.firstname 
     , m.lastname 
     , b.Title 
    FROM 
     Member m 
      INNER JOIN History h ON h.memberID = m.memberID 
      INNER JOIN Book b ON h.bookID = b.bookID 
       AND b.title LIKE '%Harry Potter%' 
) ResultSet 
GROUP BY MemberID, FirstName, LastName 
HAVING COUNT(DISTINCT BookTitle) = 3; 
+0

私はちょうど不思議に思っています...タイトルの中にHPと一緒に*すべての本(少なくともそれぞれ1部)を借りたメンバーだけが欲しいですか?または...タイトルにHPと少なくとも1冊の本を借りたメンバーですか?私の答えは、これらのケースの後者をカバーするでしょう... –

+0

質問の私の理解から、それはタイトル "ハリーポッター"とすべての書籍を借りているメンバーが欲しいということであり、複数のコピーがある場合は、少なくとも一つの。だからあなたの答えは2番だと思います。 – tubvajlis

+0

だから、実際にレンタル/チェックアウトしたメンバーは、書籍タイトル「Harry Potter」で現在または過去のいずれかにしか望んでいないと思います。 4冊の本のうち現在または履歴2にのみチェックアウトしているメンバーがいる場合は、そのメンバーを出力しないでください。 – tubvajlis

関連する問題