Postgres中左联接的分页

6

摘要:

我有一些需要在客户端显示的数据库数据。到目前为止,这些数据没有进行分页,但现在数据已经增长到影响连接速度的程度了。所以我想对其进行分页。

设置:

  • 客户端使用DataTables
  • 服务器端使用F#
  • 数据库是postgres

问题:

enter image description here

我有3个表:表[A,B,C]。表A与表B和C存在着一对多的关系。因此,当我执行以下查询时

select * from A left join B on a.id = b.tableidb left join C on a.id = c.tableidc

enter image description here

我会得到7行,这很好。这实际上是我想要的所有数据。问题真正出现在我们尝试进行分页时

select * from A left join B on a.id = b.tableidb left join C on a.id = c.tableidc limit 5 offset 0

enter image description here

如您所见,它确实只返回5行。然而,由于进行了左连接,我们并没有得到完整的数据集。

期望解决方案

我想说的是类似于“从表A的0偏移量开始给我5行数据,然后在表B和C上进行左连接”的语句。

是否有一种方法可以在postgres中实现这个目标呢?

1个回答

12

您可以在 FROM 子句中使用子查询。

您所需要做的就是在此处限制行数:

SELECT *
FROM (SELECT * FROM A
      ORDER BY a.id
      LIMIT 5) AS al
   LEFT JOIN b ON al.id = b.tableidb
   LEFT JOIN c on al.id = c.tableidc;

注:

  1. 使用 LIMIT 而没有 ORDER BY 没有太多意义。

  2. 如果考虑分页,请不要使用 LIMITOFFSET

    相反地,请记住你第一次选择的最后一个 a.id,然后查询 WHERE a.id > previous_a_id LIMIT 5


1
哈,我正好在尝试做一个子查询!有时候SO具有很好的橡皮鸭效应。感谢您的回答。我会使用这个的。非常感谢。 - DotNetRussell
@DragosRizescu 那么你必须做一些不同的事情。 - Laurenz Albe
1
@DragosRizescu 如果你无法理解,请再提一个问题。评论区不适合新问题。 - Laurenz Albe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接