我不确定我的查询是否正在执行问题。我要么弄错了问题,要么我对这个问题想要什么感到困惑。但是,从我提出的问题是找到所有会员ID,名字和姓氏,所有会员已经签出/或在“哈利波特”一书的过去签出。
以下是问题:
列出目前或过去借用图书馆中标题为“哈利波特”的所有图书的成员的memberID,名字和姓氏。如果任何此类书籍有多份副本,则该成员必须至少借用每本书籍的一份副本。
代码:
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%');
答案 0 :(得分:2)
在提供正确答案方面,您的代码是正确的。但是,明确的JOIN
语句更好,更不容易产生误解。另外,请查看oracle
...
INSERT ALL
结构
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%';
<强>更新强>
如果您只查找借用了所有三种不同HP图书的会员,则可以使用以下查询。请注意,使用现有数据,您根本不会得到任何结果。将计数更改为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;