Sql 选择分页连接行以可靠限制不同的相关行

Sql 选择分页连接行以可靠限制不同的相关行,sql,sql-server,join,distinct,sql-server-2017,Sql,Sql Server,Join,Distinct,Sql Server 2017,考虑一个包含四个表的SQL Server 2017数据库;A、 B、C和D 表D引用了带有外键约束的C,正如C到B和B到a一样 其目的是将每个表内部联接在一起,选择D中满足某些条件的所有行,但仅限于联接到表a中定义数量n行的点 这应该是可分页的,以便具有定义偏移量的后续查询可以将其结果集D行间接连接到下一组n表a行 请注意,并非所有或甚至大多数表A的行都与表D中的行没有一个更有效的关系是很常见的。因此,使用基本的SELECT DISTINCT TOP n不会为表D行的结果集提供可靠数量的不同表A

考虑一个包含四个表的SQL Server 2017数据库;A、 B、C和D

表D引用了带有外键约束的C,正如C到B和B到a一样

其目的是将每个表内部联接在一起,选择D中满足某些条件的所有行,但仅限于联接到表a中定义数量n行的点

这应该是可分页的,以便具有定义偏移量的后续查询可以将其结果集D行间接连接到下一组n表a行


请注意,并非所有或甚至大多数表A的行都与表D中的行没有一个更有效的关系是很常见的。因此,使用基本的SELECT DISTINCT TOP n不会为表D行的结果集提供可靠数量的不同表A关系。

为此使用窗口函数

SELECT
*
FROM
(
SELECT
    *, dense_rank() over (order by A.ID) AS R
FROM
    A
    INNER JOIN B ON B.ID_A=A.ID
    INNER JOIN C ON C.ID_B=B.ID
    INNER JOIN D ON D.ID_C=C.ID
) AS RES
WHERE
RES.R<=PUT_LIMIT_OF_A_HERE
PUT_LIMITS_OF_ROWS_HERE

如果您想进行分页,为什么不使用fetch/offset呢?我很乐意使用fetch/offset,但目前面临的挑战是返回一个由D行组成的结果集,该结果集的行数不超过定义的行数限制。分页只是该解决方案的一个要求。我不确定我是否得到了这个。。。你只想通过PK来区分n是猜测吗?D中的行,但如果结果的总行数大于n则没有问题?能否将表A放入子查询中,从而允许n行?我想我可以通过说我想将B连接到A来简化问题,从B中选择行,但将结果限制为表示A中有多少不同行已连接到的数字。一旦我将B中的1行或多行连接到例如A中的10行,我想停止从B中选择行并返回我所拥有的。这看起来非常接近我想要的,但我担心嵌套意味着所有结果都需要在被限制之前进行检索?@Creyke要实现这一点,必须使用cursor+temp table。在R达到您想要的值后,您停止。我认为没有办法从纯SQL中改进这一点。把上面的选择作为光标选择,并做同样的事情,看看问题和答案