Sql 它说我没有被选中的行?

Sql 它说我没有被选中的行?,sql,oracle,Sql,Oracle,这是说我没有选择行 问题是: 查找过去或当前从未借过任何书籍的成员的成员ID、姓氏和名字 这是模式,主键为粗体 图书(bookID,ISBN,书名,作者,出版年份,类别) 成员(memberID,姓氏,名,地址,电话号码,限额) 当前贷款(成员ID,账簿ID,贷款日期,到期日) 历史记录(memberID,bookID,贷款日期,归还日期) 会员可以从图书馆借书。他们可以借阅的图书数量受成员关系的“限制”字段限制(不同成员的限制可能不同)。书的类别包括小说、非小说、儿童读物和参考读物。Curre

这是说我没有选择行

问题是: 查找过去或当前从未借过任何书籍的成员的成员ID、姓氏和名字

这是模式,主键为粗体

图书(bookID,ISBN,书名,作者,出版年份,类别)

成员(memberID,姓氏,名,地址,电话号码,限额)

当前贷款(成员ID账簿ID,贷款日期,到期日)

历史记录(memberIDbookID,贷款日期,归还日期)

会员可以从图书馆借书。他们可以借阅的图书数量受成员关系的“限制”字段限制(不同成员的限制可能不同)。书的类别包括小说、非小说、儿童读物和参考读物。CurrentLoan表表示有关当前已签出的书籍的信息。当书籍返回到库中时,该记录将从CurrentLoad关系中删除,并将插入到历史关系中,与归还日期保持一致。一个图书馆可能有同一本书的多个副本,在这种情况下,每个副本都有自己的图书ID,但所有副本共享相同的ISBN

这是我的代码:

CREATE TABLE Book
    (bookID INT,
    ISBN INT,
    title varchar (25),
    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, 1113312336, 'The Dog', 'Jack Crow', 1990, 'fiction');
INSERT INTO Book VALUES (12, 2221254896, 'Worms', 'Jim Kan', 2013, 'childrens');
INSERT INTO Book VALUES (13, 3332546987, 'Crow', 'Jan Flo', 2000, 'fiction'); 
INSERT INTO Book VALUES (14, 4443456215, 'Big Dog', 'Lan Big', 1993, 'children'); 
INSERT INTO Book VALUES (15, 5552314569, 'Green Apple', 'Theo Brown', 1978, 'children');
INSERT INTO Book VALUES (16, 6664581631, 'Red Bean', 'Khang Nk', 2017, 'fiction');
INSERT INTO Book VALUES (17, 7771452369, 'XML and XQuery Knowledge', 'Author Le', 2017, 'non-fiction');
INSERT INTO Book VALUES (18, 8881245525, 'The Dark Room', 'Jack Se', 2017, 'fiction');
INSERT INTO Book VALUES (19, 9991123546, 'Lonely Mens', 'Geen Brown', 2014, 'refrence');
INSERT INTO Book VALUES (20, 1122112356, 'XML or XQuery', 'Heart Le', 2002, 'fiction');

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

INSERT INTO CurrentLoan VALUES (005, 10, '13-SEP-17', '14-NOV-17');
INSERT INTO CurrentLoan VALUES (005, 19, '13-JAN-17', '15-NOV-17');
INSERT INTO CurrentLoan VALUES (003, 16, '14-FEB-17', '12-MAR-17');
INSERT INTO CurrentLoan VALUES (004, 15, '12-OCT-17', '09-NOV-17');
INSERT INTO CurrentLoan VALUES (005, 18, '13-APR-17', '12-MAY-17');

INSERT INTO History VALUES (001, 10, '14-Jan-17', '04-OCT-17');
INSERT INTO History VALUES (002, 19, '12-Jan-17', '04-NOV-17');
INSERT INTO History VALUES (003, 13, '14-APR-17', '08-OCT-17');
INSERT INTO History VALUES (005, 20, '14-MAY-17', '04-DEC-17');
我的问题是:

SELECT Member.memberID, lastname, firstname 
    FROM Member MINUS(
                    SELECT Member.memberID, lastname, firstname
                    FROM Member, CurrentLoan
                    WHERE Member.memberID = CurrentLoan.memberID
                    UNION
                    SELECT Member.memberID, lastname, firstname
                    FROM Member, History
                    WHERE Member.memberID = History.memberID);

有两种方法可以做到这一点:

您可以使用反联接,例如:

SELECT m.MEMBERID,
       m.LASTNAME,
       m.FIRSTNAME
  FROM MEMBERS m
  WHERE m.MEMBERID NOT IN (SELECT DISTINCT MEMBERID
                             FROM CURRENTLOAN
                           UNION ALL
                           SELECT DISTINCT MEMBERID
                             FROM HISTORY);
另一种方法(也是我喜欢的方法)是:

SELECT DISTINCT m.MEMBERID,
                m.LASTNAME,
                m.FIRSTNAME
  FROM MEMBERS m
  LEFT OUTER JOIN (SELECT DISTINCT MEMBERID
                     FROM (SELECT MEMBERID
                             FROM CURRENTLOAN
                           UNION ALL
                           SELECT MEMBERID
                             FROM HISTORY)) u
    ON u.MEMBERID = m.MEMBERID
  WHERE u.MEMBERID IS NULL;
但是,给定您显示的数据,此查询以及原始查询应该返回零行

请注意,如果您将当前贷款注释掉给成员004,则返回“Joe Brown”


祝您好运。

您使用的是MySQL还是Oracle?为什么在
FROM
子句中使用逗号。这是古老的语法。使用正确、明确的
JOIN
语法。您正在从
减号
语句谓词中的所有五条
Member
记录中减去。“完全需要一个空的结果集。@GordonLinoff对不起,我在使用OracleTim说的:您的数据中只有五个成员,ID从01到05。”。01、02和03显示在历史记录表中。03、04和05将显示在当前表格中。因此,无论过去还是现在,都没有任何成员从未获得过贷款。“没有返回行”是正确答案。这在现实生活中也经常发生,不仅仅是在家庭作业中,我很高兴看到家庭作业很早就教会了你这些东西。这是很好的家庭作业!为什么对这个问题投反对票?它被完美地问到:以下是创建表和插入数据的语句;这是我的疑问,我得到的结果,还有我不明白的地方。如果有什么区别的话,这是一个应该如何提问的模型。这将有助于理解为什么您更喜欢外部连接而不是反连接。有人会期望(有些人会声称他们可以证明)Oracle优化了反联接,因此它们比更一般的左外联接工作得更快。(从逻辑上讲,这是显而易见的-平均而言,反联接只需要检查“右侧表”中的一半行,以查找将被拒绝的行。标准联接将始终检查右侧表中的所有行。)@mathguy:有趣。如果你能抽出时间回答我的问题,我会很感兴趣的。谢谢。至于“为什么我更喜欢带过滤器的左外连接而不是反连接”,我想这可能是我经常与Rdb合作时的遗留问题,在我11岁的记忆中,反连接通常比较慢。旧习难改。:-)我还将编辑并添加反连接方法。幸运的是,去年我没有忘记旧习惯(我开始学习SQL——实际上只有Oracle,我知道的唯一方言);但据我所知,至少在Oracle8之前,反连接确实比常规连接慢。但那是很久以前的事了。甲骨文有些地方做错了,但它确实做对了很多事情,而且它们不会停滞不前。