2014-02-25 148 views
1

比方說,我有一個表,看起來像特定數量的記錄如下:SQL查詢來選擇與WHERE子句

ID | EntityType | Foo | Bar 
---------------------------- 
1 | Business | test | test 
2 | Family  | welp | testing 
3 | Individual | hmm | 100 
4 | Family  | test | test 
5 | Business | welp | testing 
6 | Individual | hmm | 100 

此表是相當大的,而且是隨機的(相當罕見的)情況下「業務「在EntityType列中。

查詢
SELECT TOP 500 * FROM Records WHERE EntityType='Business' ORDER BY ID DESC 

完全適用於抓住了第一套企業的,現在我將如何頁面倒退,並得到前一組的500條記錄符合我的標準是什麼?

我知道我可以查看ID之間的記錄,但不能保證它會是什麼ID,例如它不會是上一個查詢的最後一個ID減去500,因爲Business EntityType非常少見。

我也看了一些分頁模型,但我不知道如何將它們集成,同時保持我的WHERE子句它是如何(只接受EntityType of Business)並保證500條記錄(我已經使用了一個即「返回」500條記錄,並且僅顯示約18家企業,因爲它們在返回的總計500條記錄中)。

我很感謝這件事的任何幫助!

+1

是否有原因,此鏈接將無法正常工作? http://stackoverflow.com/questions/5790965/return-total-records-from-sql-server-when-using-row-number –

回答

2
select * from ( 
    select top 500 * from (
    select top 1000 * FROM Records WHERE EntityType='Business' ORDER BY ID DESC 
) x 
    order by id 
) y 
order by id desc 

最內層查詢一切 - 取前1000 ,拿到2頁,第1個結果

二級查詢 - 採取第2個記錄:從第一個查詢

Ø utermost - 重新排列結果

+1

似乎相當低效。相當確定的ROWCOUNT導致更好的性能,如果不是更具可讀性的查詢。 –

+0

@DylanB - 請告訴我爲什麼這樣做效率低下,rowcount會更好嗎? –

+0

這工作完美。謝謝 ! – kogh

1

所以,我會做與其他答案略有不同。我的查詢總是以最小行拉500行最後一行看起來像這樣,並需要一個行數。

請注意,在查詢之外使用rowcount可以更輕鬆地通過SQL語法。我希望這不是必要的。

Declare @row_min as integer 
Declare @row_count as integer 
set @row_min = 500 
SELECT @row_count = COUNT(*) FROM Records WHERE EntityType='Business' ; 
WITH MyCTE AS 
(
    SELECT 
    ID, EntityType, Foo, Bar, 
    ROW_NUMBER() OVER (ORDER BY TagId) AS 'RowNum' 
     FROM Records 
     WHERE EntityType='Business' 
) 

Select TOP 500 *, (Select Max(RowNum) From MyCTE) As RowMax 
FROM MyCTE 
WHERE EntityType='Business' 
    AND 
    RowNum > 
     Case sign(@row_count - 500 - @row_min) 
     When -1 Then (@row_count - 500) 
     ELSE @row_min 
     end 
    AND 
     RowNum < 
      Case sign(@row_count - 500 - @row_min) 
      When -1 Then (@row_count) 
      ELSE @row_min + 500 
      end 

--Note : Debugging purposes. 
    select sign(@row_count - 500 - @row_min), (@row_count - 500 - @row_min), @row_count, @row_min