gpt4 book ai didi

sql-server - 在父/子查询中对 SQL Server 中的父项进行分页

转载 作者:行者123 更新时间:2023-12-01 10:21:52 25 4
gpt4 key购买 nike

(SQL Server 2012 - 网络版)

我在这样的查询中有父/子(一对多)关系:

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

最佳答案

您可以在仅获取父行的 CTE 中进行分页,然后在后续 CTE 或主查询中加入子行。

由于您使用它的动态方式,这可能必须涉及从用于构建 @query 的相同构建 block 构建分页查询。没有看到构建 @query 的代码,我不能比这更具体了。

关于sql-server - 在父/子查询中对 SQL Server 中的父项进行分页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50514122/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com