Sql server 如何有效地限制SQLServer2000中返回的行(将行从X返回到Y)?
我正在开发一个必须与MS SQL Server 2000兼容的系统是的,很糟糕,但请告诉仍在使用它的客户。不管怎么说,我遇到了这种情况的障碍 这个表可以在it产品表中有很多记录,真的。我们的一个客户甚至有近100万条记录。我正在建立一个网络商店,需要显示该表中的记录。当然,我应该在web上提供分页功能,因此我需要一个选项来只选择从X到Y的记录Sql server 如何有效地限制SQLServer2000中返回的行(将行从X返回到Y)?,sql-server,performance,sql-server-2000,paging,compatibility,Sql Server,Performance,Sql Server 2000,Paging,Compatibility,我正在开发一个必须与MS SQL Server 2000兼容的系统是的,很糟糕,但请告诉仍在使用它的客户。不管怎么说,我遇到了这种情况的障碍 这个表可以在it产品表中有很多记录,真的。我们的一个客户甚至有近100万条记录。我正在建立一个网络商店,需要显示该表中的记录。当然,我应该在web上提供分页功能,因此我需要一个选项来只选择从X到Y的记录 但如何做到这一点,既高效,又能在SQL Server 2000中工作?据我所知,SQL Server 2000上唯一半可行的大型表解决方案是模式 SELE
但如何做到这一点,既高效,又能在SQL Server 2000中工作?据我所知,SQL Server 2000上唯一半可行的大型表解决方案是模式
SELECT TOP 100 *
FROM products p1
WHERE p1.productID not in (SELECT TOP 200 productID FROM products p2)
这将显示第201-300行
如果需要排序和筛选,通常需要确保查询和子查询中的顺序和筛选相同,否则结果会有点奇怪,如
SELECT TOP 100 *
FROM products p1
WHERE p1.productID not in (SELECT TOP 200 productID
FROM products p2
WHERE p2.productGroup = 2
ORDER BY p2.productName)
AND p1.productGroup = 2
ORDER BY p1.productName
这将返回按名称排序的productGroup为2的201-300产品
这种方法的缺点是SQLServer2000不支持TOP@variable语法,因此上述查询中的100和200无法轻松参数化。要生成此查询,您必须使用将使用动态SQL的SP,或者在客户端应用程序上编译它,然后按原样将其发送到数据库 在一篇无关的长篇大论中,我总是想知道为什么在数据库级别上不支持这种功能,例如
SELECT ROW 201-300 *
FROM products
WHERE....
正如这个场景一次又一次出现一样。据我所知,对于SQL Server 2000上的大型表,唯一半可行的解决方案是模式
SELECT TOP 100 *
FROM products p1
WHERE p1.productID not in (SELECT TOP 200 productID FROM products p2)
这将显示第201-300行
如果需要排序和筛选,通常需要确保查询和子查询中的顺序和筛选相同,否则结果会有点奇怪,如
SELECT TOP 100 *
FROM products p1
WHERE p1.productID not in (SELECT TOP 200 productID
FROM products p2
WHERE p2.productGroup = 2
ORDER BY p2.productName)
AND p1.productGroup = 2
ORDER BY p1.productName
这将返回按名称排序的productGroup为2的201-300产品
这种方法的缺点是SQLServer2000不支持TOP@variable语法,因此上述查询中的100和200无法轻松参数化。要生成此查询,您必须使用将使用动态SQL的SP,或者在客户端应用程序上编译它,然后按原样将其发送到数据库 在一篇无关的长篇大论中,我总是想知道为什么在数据库级别上不支持这种功能,例如
SELECT ROW 201-300 *
FROM products
WHERE....
由于此场景反复出现。我们使用了以下技术:
SELECT TOP @top * FROM ...
其中@top等于Y。因此SQL server只选择最上面的行,为了获得预期的页面,我们使用了简单的抓取而不提取数据,直到X为止,我们使用了以下技术:
SELECT TOP @top * FROM ...
其中@top等于Y。因此SQL server只选择最上面的行,为了获得预期的页面,我们使用了简单的获取而不提取数据,直到XSWeko得到了一个好的答案,这是我的第一个想法。如果不想使用子查询,可以:
SET ROWCOUNT @Y
SELECT *
FROM products p1
WHERE p1.productID > @X
ORDER BY p1.productID
SET ROWCOUNT 0
尽管你必须记住@X,它可能不是整数或恒等式。斯维科有一个很好的答案,这是我的第一个想法。如果不想使用子查询,可以:
SET ROWCOUNT @Y
SELECT *
FROM products p1
WHERE p1.productID > @X
ORDER BY p1.productID
SET ROWCOUNT 0
尽管您必须记住@X,它可能不是整数或标识。我在搜索类似解决方案时找到了这个答案:
SELECT
product_name,
list_price
FROM
production.products
ORDER BY
list_price,
product_name
OFFSET 10 ROWS
FETCH NEXT 10 ROWS ONLY;
完整的解释是可用的。我在搜索类似解决方案时找到了这个答案:
SELECT
product_name,
list_price
FROM
production.products
ORDER BY
list_price,
product_name
OFFSET 10 ROWS
FETCH NEXT 10 ROWS ONLY;
完整的解释是可用的。不确定,但我认为TOP@TOP是SQL Server 2005功能。抱歉-这在SQL 2000中不可能。不确定,但我认为TOP@TOP是SQL Server 2005功能。抱歉-这在SQL 2000中不可能。您肯定要包括订购,即使没有过滤——否则页面刷新的结果可能会有所不同——产品也可能出现在多个页面上,这只是一个一般性问题mess@Damien:实际上,如果表中没有排序子句,则结果应按聚集索引的顺序显示。但是,是的,为了安全起见,我总是点餐。反过来呢?从“按产品id从产品订单中选择top 100*”从“按产品id从产品订单中选择top 300*”asc p order by product\u id desc这至少不使用任何INs或其他查找。@Sweko-这是一个常见的误解。没有订货依据条款,就没有订货保证。除此之外,在Enterprise Edition中,一个表扫描可以与另一个已经在进行的表扫描相结合,用于不同的连接/查询,然后对表的开始部分进行部分表扫描,以获得它尚未获得的其余行。@SWeko-RE:2000以后的版本中,无论是行数还是介于行数之间的版本,这都非常容易,而且您肯定希望包括排序,即使没有过滤-否则结果可能会在页面刷新之间变化-产品可能会出现在多个页面上,而且它只是一个g
一般的mess@Damien:实际上,如果表中没有排序子句,则结果应按聚集索引的顺序显示。但是,是的,为了安全起见,我总是点餐。反过来呢?从“按产品id从产品订单中选择top 100*”从“按产品id从产品订单中选择top 300*”asc p order by product\u id desc这至少不使用任何INs或其他查找。@Sweko-这是一个常见的误解。没有订货依据条款,就没有订货保证。除此之外,在Enterprise Edition中,一个表扫描可以与另一个已经在进行的表扫描相结合,用于不同的连接/查询,然后对表的开始部分进行部分表扫描,以获得它尚未获得的其余行。@SWeko-RE:您的回答在2000以后的版本中,这非常容易,行数介于和之间,无论如何,我很想告诉客户他们的硬件规格很差,请留下他们的详细信息:@digiguru-抱歉,我甚至不知道他们是谁,我想有好几个这样的客户,因为我们销售的软件在这里很受欢迎。我想告诉客户他们的硬件规格很糟糕,请留下他们的详细信息:@digiguru-对不起,我甚至不知道他们是谁,我想有好几个这样的客户,因为我们销售的软件在这里很受欢迎。这和top有什么不同吗?事实上,这是一个有趣的想法,即使是top。这使得在页面之间来回走动变得很容易,而且性能非常好。但是,您不能跳转到任意页面,这是一个缺点。我不知道,也许这可以结合使用。SQL Server 2000不支持TOP@variable语法。但您可以使用SET ROWCOUNT@Y将其作为参数发送。排名靠前的答案有固定的100条记录。这和排名靠前的有什么不同吗?事实上,这是一个有趣的想法,即使排名靠前。这使得在页面之间来回走动变得很容易,而且性能非常好。但是,您不能跳转到任意页面,这是一个缺点。我不知道,也许这可以结合使用。SQL Server 2000不支持TOP@variable语法。但您可以使用SET ROWCOUNT@Y将其作为参数发送。最上面的答案有固定的100条记录。问题是-此语法是在SQL Server 2012中引入的,而此问题是关于SQL Server 2000的:虽然对于当前版本,是的,这绝对是正确的选择问题是-此语法是在SQL Server 2012中引入的,而此问题是关于SQL Server 2000的:虽然对于当前版本,是的,这绝对是正确的选择