2014-02-25 149 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