在下面的查询中,我想检索@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
答案 0 :(得分:0)
我使用AdventureWorks2008R2数据库中的Sales.SalesOrderHeader
和Sales.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
)
诺尔