带有 JOIN 的 SQL Server SELECT 分页

Posted

技术标签:

【中文标题】带有 JOIN 的 SQL Server SELECT 分页【英文标题】:SQL Server SELECT paging with JOIN 【发布时间】:2014-11-11 21:37:06 【问题描述】:

我正在从一个表中选择并使用多对一关系进行左连接。

我要解决的问题是分页。我只想在 tableA 上进行分页。

例子:

SELECT * 
FROM tableA 
[WHERE HERE] OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY

这将返回 tableA 的第 0 - 9 行。 完美

现在的问题是当我介绍加入时。我仍然想要 tableA 的第 1-10 行,但是当我进行连接时,它会按预期引入额外的行,因为 tableB 将有多个条目来连接每个 tableA 行。所以现在我不再从 tableA 中得到相同的行,我可能只得到前 2 行,但由于加入,总共有 10 行。

SELECT * 
FROM tableA 
LEFT JOIN tableB ON foo = bar 
[WHERE HERE] OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY

我想取回连接产生的行数,但只在 tableA 的 0-9(或 10-19)上

为了澄清,每个 tableA 行有多个 tableB 行。我只想根据 tableA 进行选择和分页,但仍要返回 tableB 上所有连接的条目。

【问题讨论】:

您的订单在哪里?你如何确定“相同”的行? “所有连接”是什么意思? 您找到解决方案了吗?在断言一个总订单以确保您不会得到重复之后,一种蛮力的方法是从数据库中获取完整的集合并在用户代码中减少结果(即进行分页)。 【参考方案1】:

这种情况下可以使用内部查询

SELECT *
   FROM (
   SELECT * FROM tableA [WHERE HERE] OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY
   ) q
JOIN tableB on foo = bar [WHERE HERE]

【讨论】:

有趣。我有个问题。如果我在 tableB 上的 where 子句只返回 5 行而不是 tableA 产生的 10 行,这不会只给我 5 个结果吗?如果 tableA 没有首先受到限制,什么时候可能会有更多匹配? 是的,在这种情况下,只会返回 5 行。这不是您的要求“我想取回与连接产生的行一样多的行,但只在 tableA 的 0-9(或 10-19)上”? 这就是我写的,但我想要的是总是从 tableA 中获取 10 行。我们将把连接合并成单个对象(连接将是子对象)。因此,如果我们要求第 0-9 行,我们最终需要 10 个对象。也许我需要坐下来改写我原来的帖子。【参考方案2】:

我认为它不适用于您的查询,因为这个 0-10 提取将应用于连接返回的结果。您是否尝试过这样做:

SELECT * FROM tableB on foo in 
    SELECT bar FROM tableA [WHERE HERE] OFFSET 0 ROWS FETCH NEXT 10 ROWS ONLY

【讨论】:

以上是关于带有 JOIN 的 SQL Server SELECT 分页的主要内容,如果未能解决你的问题,请参考以下文章

SQL COUNT()/ LEFT JOIN?

MS Access - SQL LEFT JOIN 多个条件

SQL中LEFT和Right join的原因是啥

INNER JOIN与LEFT JOIN在SQL Server的性能

SQL Server Join方式

SQL Server JOINS:SQL Server 中是不是默认关联“JOIN”语句“LEFT OUTER”? [复制]