2012-10-10 196 views
-1

我已經試過篩選子查詢結果

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

基本上表貸款包含已從圖書館借出的book_id列表。

我需要尚未借出的book_id。然後需要按照作者姓名的字母順序對其進行排序(因此order by A.name

注意:包含書籍的表僅包含author_id。爲了得到作者的名字,我需要將author_id與表AUTHOR中的ID進行比較。

任何人都可以告訴我我做錯了什麼,或者 - 如果我使用錯誤的方法 - 使用什麼方法?

回答

1

這將選擇任何以前沒有借出的圖書的標題。我們可以通過使用NOT IN語句從書本返回任何頭銜,其中book_id不在LOANS表檢查:

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語句的語法。

+0

您是否看過我最初的問題?我已經嘗試過了,但沒有奏效。另外,你做的方式,我將無法比較作者的名字,它會導致大量的書籍,而只有20本書... PS:'而不是b.book_id在(選擇你LOANS的.book_id)'是我試過的... ...與NOT IN相同 – Yorrick

+0

是的,我誤解了它的一部分,但是你沒有說出你的查詢不起作用,或者爲什麼這會返回大量的書籍。無論如何,編輯我的答案。我還*真的不知道爲什麼你在'book'表中有'author_id',那個設計沒有任何意義;您最好使用包含'book_id'的作者列表。 – LittleBobbyTables

+0

真的,我正在使用'where a.author_id = b.author id'而不是'inner join',因爲它是爲了一個類而我會失敗如果我使用我們還沒有看到的東西:P我們'不要在INNER JOIN部分 - 不幸的是。 無論如何,我的問題是查詢只是使用所有的書籍+所有的可能性,因爲我在主查詢中使用了'從貸款U',我也不應該這樣做。 – Yorrick

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 
+0

對不起,我以爲我這麼說過。 – HABO

+0

當我發佈我的答案時,你的答覆還沒有在那裏,對不起的人。 PS:如果我不知道你的回答與我回答的相同,我甚至不會意識到它的作用:D – Yorrick

1

您查詢加入Loans表,但後來嘗試包括結果不存在行Loans。如果您刪除Loans上的連接,則第二個查詢應該可以工作。第一個如果你LEFT OUTER JOIN和檢查U.Book_Id is NULL

順便提一句,您的子查詢返回限定列u.book_id。從Loans的選擇中,這不會做你期望的。