首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Postgres:使用UNION获取匹配记录的总数

问Postgres:使用UNION获取匹配记录的总数
EN

Database Administration用户
提问于 2015-12-08 23:21:02
回答 1查看 1.9K关注 0票数 1

我正在运行一个分页的SELECT ... UNION查询,我需要确定结果集中的页面数。例如,考虑查询:

代码语言:javascript
复制
(SELECT id, 'table1' AS type, COUNT(*) OVER() AS matches FROM table1)
UNION
(SELECT id, 'table2' AS type, COUNT(*) OVER() AS matches FROM table2)
LIMIT 3

当我得到以下结果集时,我可以确定匹配记录的总数:

代码语言:javascript
复制
| id | type   | matches |
|  1 | table1 |      12 |
|  2 | table1 |      12 |
|  1 | table2 |     150 |

然后,将不同的matches列相加,我将得到返回的记录总数,162个。但是,如果我当前的LIMIT/OFFSET没有给出来自table2的任何记录,那么我就不能再判断需要多少页的数据了:

代码语言:javascript
复制
 | id | type   | matches |
 |  1 | table1 |      12 |
 |  2 | table1 |      12 |
 |  3 | table1 |      12 |

如何从UNION中的所有子句中找到匹配记录的总数,即使不是所有子句都返回当前LIMIT/OFFSET范围内的记录?

EN

回答 1

Database Administration用户

回答已采纳

发布于 2015-12-08 23:29:56

我觉得你只需要改变你的查询..。

代码语言:javascript
复制
(SELECT
  NULL AS id,
  'allTables' AS type,
  (SELECT COUNT(*) OVER() FROM table1) + (SELECT COUNT(*) OVER() FROM table2) AS matches)
UNION
(SELECT id, 'table1' AS type, COUNT(*) OVER() AS matches FROM table1)
UNION
(SELECT id, 'table2' AS type, COUNT(*) OVER() AS matches FROM table2)
LIMIT (1 + 3)

但我不能说它有多有效率.

-额外

这也可能有效。但是,效率很可能很差(因为它会得到所有的结果,不管你是否使用它)。

代码语言:javascript
复制
WITH results as (
  (SELECT id, 'table1' AS type, COUNT(*) OVER() AS matches FROM table1)
  UNION
  (SELECT id, 'table2' AS type, COUNT(*) OVER() AS matches FROM table2)
) SELECT NULL AS id, 'allTables' AS type, COUNT(matches) FROM results
UNION
SELECT id, type, matches FROM results
LIMIT (1 + 3)

无论是哪种情况,对DB都不是很友好。但是,您只需要使用WHERE子句两次(而不是4次)

票数 1
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/123246

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档