在左联接的Postgres中分页

时间:2018-08-16 12:15:46

标签: postgresql

摘要:

我的数据库中有数据,需要在客户端显示。到现在为止还没有分页,但是现在数据已经增长到明显降低连接速度的地步。所以我想分页。

设置:

  • 客户端,我正在使用数据表
  • 服务器端我正在使用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给我5行偏移量为0的行,然后在表B和C上左联接”的结果。

在postgres中有办法吗?

1 个答案:

答案 0 :(得分:5)

您可以在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