一个可以检索完整的行计数,也可以返回部分结果

时间:2018-07-30 19:58:28

标签: sql-server tsql

我正在尝试简化RestApi的往返时间。用户将查询所有邮政编码的列表,比如说邮政编码为90017。由于我不希望将1000条以上的记录发送至应用程序,因此我想查询并查看有多少条记录符合条件(如果记录较少)假设100条返回所有记录(如果未返回前100条)以及总记录的nbr条,则客户端应用可以通过结果进行分页。

1 个答案:

答案 0 :(得分:2)

您要查找两个结果集吗?

如果是这样,您可以这样做:

-- return top 100 rows max ( returns all if less than 100 ) --
SELECT TOP 100 * FROM dbo.{your_table_name} WHERE Zipcode = '90017';

-- return record count for zip queried --
SELECT COUNT( * ) AS ZipCount FROM dbo.{your_table_name} WHERE Zipcode = '90017';

或者,如果您想要一个结果集,则可以执行以下操作:

SELECT TOP 100 
    avail.ZipCount, ZipInfo.*
FROM dbo.{your_table_name} ZipInfo
CROSS APPLY (
    SELECT COUNT( * ) AS ZipCount FROM dbo.{your_table_name} WHERE Zipcode = ZipInfo.Zipcode
) AS avail
WHERE ZipInfo.Zipcode = '90017';

请注意,使用CROSS APPLY时,每一行的可用记录计数都会重复。而且,此方法比单独选择计数要花费更长的时间。

您可能会想尝试:

SELECT TOP 100 
    ZipInfo.*
    , ( SELECT COUNT( * ) FROM dbo.{your_table_name} WHERE Zipcode = ZipInfo.Zipcode ) AS RowsAvail
FROM dbo.{your_table_name} ZipInfo
WHERE Zipcode = '90017';

但是,这比对CROSS APPLY消耗的资源更多,因为它在每一行都执行-最好避免这种情况。请改用CROSS APPLY。

@HABO的评论中提到您将ORDER BY添加到结果集中。