我试过了
select title
from BOOKS B, AUTHOR A, LOANS U
where a.author_id = b.author_id
and not B.book_id = U.book_id
order by A.name
和
select title
from BOOKS B, AUTHOR A, LOANS U
where b.author_id = a.author_id
and not b.book_id in (select u.book_id from LOANS)
order by A.name, b.title
我需要的只是来自我的子查询select u.book_id from LOANS
基本上,LOANS表包含一个从库中借出的book_id列表。
我需要尚未借出的book_id。然后需要按作者的名字(即order by A.name
)
注意:包含图书的表格仅包含author_id。要获取作者的姓名,我需要将author_id与表AUTHOR中的id进行比较。
任何可以告诉我我做错了什么的人,或者 - 如果我使用了错误的方法 - 使用什么方法代替?
答案 0 :(得分:1)
这将选择之前未借出的任何书籍的标题。我们可以使用NOT IN
语句来检查这一点,以返回book_id
表中LOANS
不在的BOOKS中的任何标题:
SELECT b.title
FROM BOOKS b
INNER JOIN AUTHORS a ON a.author_id = b.author_id
WHERE b.book_id NOT IN (
SELECT book_id FROM LOANS
)
ORDER BY a.[Name]
您确实应该使用ANSI连接语法,而不是使用WHERE
语句。
答案 1 :(得分:1)
您的查询加入Loans
表格,但随后尝试将结果包含在Loans
中没有行的位置。如果您删除Loans
上的联接,则第二个查询应该有效。第一个是LEFT OUTER JOIN
并检查U.Book_Id is NULL
。
顺便提一下,您的子查询返回限定列u.book_id
。在Loans
的选择中,这不会达到预期效果。
答案 2 :(得分:0)
我找到了。
FROM BOOKS B, AUTHOR A, LOANS U
必须是FROM BOOKS B, AUTHOR A
我的代码最终有效:
select title
from BOOKS B, AUTHOR A
where b.author_id = a.author_id
and not b.book_id in (select u.book_id from LOANS U)
order by A.name