限制SQL Server中的选定行

时间:2017-06-12 07:28:48

标签: sql-server-2008

在下面的查询中,我想检索@MaximumRecords行,因此没有ProjectId会在@MaximumRecords之外留下行。

例如,如果@ MaximumRecords = 100,而ProjectId = 7在行号99-102处有记录,我希望仅检索ProjectId = 1到ProjectId = 6的行(稍后将从ProjectId = 7开始再次运行查询)。我该怎么做?

SELECT TOP (@MaximumRecords) 
    t1.ProjectId,
    t1.Row2,
    t2.Row3
FROM Table1 t1
    JOIN Table2 t2 ON t1.ProjectId = t2.ProjectId
ORDER BY
    t1.ProjectId ASC
WHERE
    t1.ProjectId > @InitialProjectId

1 个答案:

答案 0 :(得分:0)

我使用AdventureWorks2008R2数据库中的Sales.SalesOrderHeaderSales.SalesOrderDetail表格编写了一个解决方案,使用该技术获得了here的运行总计。

基本思路是获取每个SalesOrderID(在您的情况下为ProjectID)的计数的运行总计,然后选择每个SalesOrderID的所有数据,其中计数的运行总计小于@MaximumRecords。然后,您需要捕获返回数据中的最大ID,并在下次运行查询时使用该值。

使用SQL Server 2012可以轻松完成此任务,这也在上面给出的链接中进行了描述。

这是......

USE AdventureWorks2008R2

IF OBJECT_ID('tempdb..#Test', 'U') IS NOT NULL DROP TABLE #Test;

DECLARE @MaximumRecords INT
DECLARE @InitialSalesOrderID INT

SET @MaximumRecords = 500
SET @InitialSalesOrderID = 43663

SELECT a.SalesOrderID, COUNT(*) AS 'Count'
INTO #Test
FROM Sales.SalesOrderHeader a
INNER JOIN Sales.SalesOrderDetail b ON a.SalesOrderID = b.SalesOrderID
WHERE a.SalesOrderID > @InitialSalesOrderID
GROUP BY a.SalesOrderID

SELECT * FROM Sales.SalesOrderHeader a
INNER JOIN Sales.SalesOrderDetail b ON a.SalesOrderID = b.SalesOrderID
WHERE a.SalesOrderID IN (
SELECT
    a.SalesOrderID
FROM
    #Test a
WHERE (
     SELECT
        SUM(Count)
     FROM
        #Test b
     WHERE
        b.SalesOrderID <= a.SalesOrderID
    ) < @MaximumRecords
)

诺尔