2013-07-12 112 views
1

我使用SQL Server 2008 R2,我有表:一個簡單的選擇SQL語句

Book: id, name, ... >> 3500 rows 
BookChapter: id, bookid, content(nvarchar(max)... >> it has about 300000 rows 

的2

現在我想沒有關係來算,目前沒有任何章節的所有書籍。

SELECT  COUNT(Id) AS Expr1 
FROM   dbo.Book 
WHERE  (Id NOT IN (SELECT BookId FROM dbo.BookChapter)) 

總是給超時過期。我怎樣才能實現它?

+0

您是否在SQL Server Management Studio中獲取了SQL超時值,或者您正在調用它的應用程序是否超時? – logixologist

+0

超時在sqlmanagement工作室 –

回答

4

嘗試使用左加入其類似於不存在,但有時候執行得更好。

select count(1) as Counts 
from 
    dbo.Book B 
    left join dbo.BookChapter BC on BC.BookID = B.ID 
where 
    BC.BookID is null 
+0

它工作得很好。 –

+0

如果您報告所有答案的查詢執行時間,那將會很有趣。如果你有章節中的bookid索引,這應該是公平的,你應該擁有這些索引。 – apartridge

+0

@apartridge上面的左連接立即顯示,幾乎爲0ms,結果是正確的,而其他子查詢在Sql管理工作室中超時到期。沒有結果。 –

0

您的子查詢變得非常大。您可以嘗試通過BookId進行分組。

SELECT COUNT(Id) AS Expr1 
FROM dbo.Book 
WHERE (Id NOT IN (SELECT BookId FROM dbo.BookChapter GROUP BY BookId)) 

另一個選項使用NOT EXISTS;

SELECT COUNT(B.Id) AS count 
FROM dbo.Book B 
WHERE NOT EXISTS (SELECT * FROM dbo.BookChapter WHERE BookId=B.BookId)) 
+0

感謝您的及時回覆。它仍然效率不高,仍然超時。 –

+0

你在'BookChapter'上有索引'BookId'嗎? – apartridge

+0

哦對不起,我是新來的SQL和全文索引以及。我會盡力弄清楚。 –

0

請勿使用「不在」中。這太慢了。您可以使用「不存在」按apartidge的第二個建議,或者你可以做的完全不直觀的是這樣的:

select count(*) BooksWithoutChapters 
from book 
where id in 
(select id 
from book 
minus 
select bookid 
from BookChapter 
)