(SQL Server 2012 - Web Edition)
在这种情况下,是否可以对父表(a)进行分页而不是整个查询?我能否修改我的分页查询(非检索查询本身的SQL),以便在请求10行时,它会从父表中给出10行,并附带'x'个子行?
我知道我没有提供更大的背景,但这个背景比较复杂。如果需要,我们可以谈及到那里,但它很复杂。以下是我们此次翻译的一部分内容。
我在一个查询中有一个父子(一对多)关系,如下所示:
SELECT a.a, a.b, b.c
FROM tablea INNER JOIN
tableb ON b.pk = a.fk
我有一个包含以下内容的大型分页查询,使用标准的(伪代码):
WITH C as (SELECT top(@perpage*@pagenum) rowID = row_number() OVER (somefield)),
SELECT c.* FROM C (query) WHERE DT_RowId > (@pagenum-1)*@perpage
在这种情况下,是否可以对父表(a)进行分页而不是整个查询?我能否修改我的分页查询(非检索查询本身的SQL),以便在请求10行时,它会从父表中给出10行,并附带'x'个子行?
我知道我没有提供更大的背景,但这个背景比较复杂。如果需要,我们可以谈及到那里,但它很复杂。以下是我们此次翻译的一部分内容。
IF UPPER(LEFT(@rSQL, 6)) = 'SELECT'
BEGIN
SET @rSQL = 'SELECT * FROM (' + @rSQL + ')' + ' as rTBL';
SET @rSQL = RIGHT(@rSQL, LEN(@rSQL)-7);
IF (LEN(LTRIM(@search)) > 0)
BEGIN
SET @rPaging =
'IF (@schemaonly=1) SET FMTONLY ON;
SELECT @ttlrows = COUNT(*) FROM (SELECT ' + @rSQL + @rWhere + ') AS TBL;
WITH C as (select top(@perpage*@pagenum) DT_RowId = ROW_NUMBER() OVER (' + @rOrder + '), ';
SET @rPaging = @rPaging + @rSQL + @rWhere + ')
SELECT C.*' + @rcols + ', (@perpage-1) * @pagenum as pagenum, @ttlrows as ct, CEILING(@ttlrows / CAST(@perpage AS FLOAT)) as pages
FROM C '+ @query + ' WHERE DT_RowId > (@pagenum-1) * @perpage ';
END
ELSE
BEGIN
SET @rPaging =
'IF (@schemaonly=1) SET FMTONLY ON;
SELECT @ttlrows = COUNT(*) FROM (' + @oSQL + ') AS SUBQUERY;
WITH C as (select top(@perpage*@pagenum) DT_RowId = ROW_NUMBER() OVER (' + @rOrder + '), ';
SET @rPaging = @rPaging + @rSQL + ')
SELECT C.*' + @rcols + ',(@perpage-1) * @pagenum as pagenum, @ttlrows as ct, CEILING(@ttlrows / CAST(@perpage AS FLOAT)) as pages
FROM C '+ @query + ' WHERE DT_RowId > (@pagenum-1) * @perpage ';
END
PRINT @rPaging;
EXECUTE SP_EXECUTESQL @rPaging, @parms, @ttlrows out, @schemaonly, @perpage, @pagenum, @fksiteID, @filter1, @filter2, @filter3, @filter4, @intfilter1, @intfilter2, @intfilter3, @intfilter4, @datefilter1, @datefilter2, @search;
SET FMTONLY OFF;
END
ELSE
BEGIN
SET @rSQL = LTRIM(REPLACE(UPPER(@rSQL), 'EXEC',''));
EXECUTE SP_EXECUTESQL @rSQL, @parms, @ttlrows out, @schemaonly, @perpage, @pagenum, @fksiteID, @filter1, @filter2, @filter3, @filter4, @intfilter1, @intfilter2, @intfilter3, @intfilter4, @datefilter1, @datefilter2;
END