从主查询T-SQL过滤子查询结果

时间:2012-10-10 17:17:31

标签: tsql filter subquery

我试过了

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进行比较。

任何可以告诉我我做错了什么的人,或者 - 如果我使用了错误的方法 - 使用什么方法代替?

3 个答案:

答案 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