也算是13的新特性吧,是看了一篇文章觉的很有意思,所以拿出来做下实验。
相信大家在使用翻页的时候,一般都会使用limit offset子句,但是其实这个是不符合SQL标准的,我们看看符合SQL标准的FETCH FIRST 子句如何使用。

先看下limit offset子句

LIMIT { count | ALL }
OFFSET start

count表示返回的最大行数
start指定跳过的行数
如果count为null,那么就是显示所有行,即limit all

#创建测试表,插入数据,select语句均为相同结果
postgres=#  CREATE TABLE t_test (id int);
CREATE TABLE
postgres=# INSERT INTO t_test
postgres-# VALUES  (1), (2), (3), (3),
postgres-# (4), (4), (5);
INSERT 0 7
postgres=# select * from t_test ;id
----1233445
(7 rows)postgres=# select * from t_test limit all;id
----1233445
(7 rows)postgres=# select * from t_test limit null;id
----1233445
(7 rows)

SQL2008引入FETCH子句可以达到相同的效果

OFFSET start { ROW | ROWS }
FETCH { FIRST | NEXT } [ count ] { ROW | ROWS } { ONLY | WITH TIES }

我们还是拿上面那个简单的表来演示一下:

#如下:两条语句的结果是相同的
postgres=# select * from t_test limit 3;id
----123
(3 rows)
postgres=# select * from t_test fetch first 3 rows only;id
----123
(3 rows)

FETCH FIRST … ROWS WITH TIES

#如下:虽然fetch first 3,但是实际返回4行,因为3有重复的列,重复的在这里都会显示,相当于显示了3个种类的值,这里为1,2,3
postgres=# select * from t_test order by id fetch first 3 rows with ties;id
----1233
(4 rows)#比如我们再插入一行,这里id为2的就是两行,这次返回了3行,但是值的种类只有2个,也就是1和2
postgres=# insert into t_test values (2);
INSERT 0 1
postgres=# select * from t_test order by id fetch first 3 rows with ties;id
----122
(3 rows)#我们再加一个字段,看下显示结果
postgres=# ALTER TABLE t_test
postgres-#            ADD COLUMN x numeric DEFAULT random();
ALTER TABLE
postgres=# TABLE t_test;id |         x
----+--------------------1 |  0.6188205046757922 |  0.2695493934132783 |  0.8014484733390113 |  0.6695050401783934 | 0.04540589537573334 |  0.1644685560411365 |  0.9449762200826122 |  0.232911738163509
(8 rows)#这里看到是取4行,但是3这个排序的字段有重复值,所以会把id=3的全部显示出来,注意,这里只有order by的字段和with ties有关,这里是id和with ties有关,如下:
postgres=# SELECT *
postgres-#             FROM  t_test
postgres-#             ORDER BY id
postgres-#             FETCH FIRST 4 ROWS WITH TIES;id |         x
----+-------------------1 | 0.6188205046757922 | 0.2695493934132782 | 0.2329117381635093 | 0.6695050401783933 | 0.801448473339011
(5 rows)#再看下按id,x排序的,因为x字段没有重复值,这里是id,x和with ties有关,只有id,x两列都相同的情况,才会一直往后取,所以这里取4行
postgres=# SELECT *
postgres-#            FROM  t_test
postgres-#            ORDER BY id, x
postgres-#            FETCH FIRST 4 ROWS WITH TIES;id |         x
----+-------------------1 | 0.6188205046757922 | 0.2329117381635092 | 0.2695493934132783 | 0.669505040178393
(4 rows)

其实上面例子展示了这么多,是很好理解的,即我们要看order by后面的字段,这些字段的值是否重复,重复就证明打结了(tie不就是结的意思吗?),没有变化,就会把这个打的结全部显示出来。

另外在查询数据的时候,如果这个结在中间,而不在末尾,那么每一行就实际算作一行,如果在末尾,那么就不受fetch限制,有多少重复的都会取出来,如下:前面两句返回的结果一样,最后取5行的时候,实际返回6行。

postgres=# select * from t_test order by id fetch first 3 rows with ties;id |         x
----+-------------------1 | 0.6188205046757922 | 0.2695493934132782 | 0.9343321498858152 | 0.232911738163509
(4 rows)postgres=# select * from t_test order by id fetch first 4 rows with ties;id |         x
----+-------------------1 | 0.6188205046757922 | 0.2695493934132782 | 0.9343321498858152 | 0.232911738163509
(4 rows)postgres=# select * from t_test order by id fetch first 5 rows with ties;id |         x
----+-------------------1 | 0.6188205046757922 | 0.2695493934132782 | 0.9343321498858152 | 0.2329117381635093 | 0.8014484733390113 | 0.669505040178393
(6 rows)

参考:
https://www.cybertec-postgresql.com/en/postgresql-limit-vs-fetch-first-rows-with-ties/
https://www.postgresql.org/docs/13/sql-select.html#SQL-LIMIT

Postgresql13之FETCH FIRST ROWS … WITH TIES展示打结的行相关推荐

  1. 12c分页查询特性FETCH FIRST ROWS,OFFSET ROWS FETCH NEXT ROW LIMIT Clause子句

    Database 12c的FETCH FIRST ROWS特性可以简化老版本中ROW_NUM()或ROWNUM的分页排序写法, 大幅节约开发花在分页查询语句上的时间. row-limiting子句用以 ...

  2. 解决列表某项文字过度过多 需要自适应撑开高度展示 其他项目按照行高居中

    解决列表某项文字过度过多 需要自适应撑开高度展示 其他项目按照行高居中 以下代码可直接复制: 两种方法:分别是方法1:bfc配合浮动撑高 其他项目子绝父相 方法二:第一项也是相对定位(不推荐) < ...

  3. Oracle高级数据库复习

    考试大纲 文章目录 ==考试大纲== ==分章考点== 第三章.Oracle数据库系统结构 图:数据库系统结构内部关系 第四章.数据库设计 第五章.数据库存储设置与管理 表空间的设置与管理(要记sql ...

  4. 查找行迁移及消除行迁移(chained rows)

    转自http://blog.csdn.net/leshami/article/details/7266719 一.概述:   如果你的Oracle数据库性能低下,行链接和行迁移可能是其中的原因之一.我 ...

  5. oracle fetch into语法,Oracle Fetch

    oracle函数 的 Oracle Fetch 在本教程中,将学习如何使用Oracle FETCH子句来限制查询返回的行数. Oracle FETCH子句简介 一些RDBMS(如和)使用子句来检索查询 ...

  6. Oracle/PLSQL FETCH Statement

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! Orac ...

  7. 精确实现popover效果:内容超出容器则tooltips+popover展示,反之无效果

    前端中对于:"文字超出tooltip展示,鼠标滑过气泡展示所有内容",这样的需求是很常见的,element-ui也有专门的组件el-popover组件支持类似需求的实现 要实现这样 ...

  8. ExtJS grid简单应用之 展示JSON数据

    Grid功能:  展示json数据,编辑行,排序,分页.分页功能要根据请求URL的参数,在服务器端返回相应JSON,此处服务端未写.(url参数,可通过firebug控制台查看) 1,首先引用 < ...

  9. PyQt5 技巧篇-复选框绑定行内容,全选、清空、展示选中的内容功能实现演示,设置复选框选中,检查复选框选中状态

    先看效果图,选中了几行,然后将选中的内容展示出来. 我设置两个有序序列,分别存储对应的复选框和行内容. 我的行内容是用的 label 标签. # 存储右边label组件的有序列表def get_L_b ...

  10. Go + Excel 学习 Excelize rows.go

    Copyright 2016 - 2019 The excelize Authors. 版权所有2016-2019优秀作者. All rights reserved. 保留所有权利. Use of t ...

最新文章

  1. zabbix 监控项自动发现过滤_Zabbix5.2由浅入深之官方自动发现规则初探(网络篇)
  2. js 定时任务,定时器
  3. android中volley通信框架简介
  4. Python(迭代、三元表达式、列表生成、生成器、迭代器)
  5. 8.17——继续熟悉linux的命令行
  6. Effective.Java第23-33条(泛型相关)
  7. python二维码生成器制作中报错为oserror_Python生成:OSError:[WinError 193]%1不是有效的Win32应用程序...
  8. java spring hiberate_Java程序员:Spring Boot和Hibernate一起使用的技巧
  9. AutoLISP绘制圆DCL对话框
  10. Python初学16——程序设计方法学
  11. 对计算机专业的认识和未来规划,对计算机专业的认识及学业规划
  12. 处理器仿存带宽_CPU,内存,主板带宽是怎么计算的?网上帖子说内存和主板的带宽要大于等于CPU带宽,充分利用CPU...
  13. 使用 Anaconda 安装 Pytorch
  14. 商品的价格术语(外贸知识三)
  15. 彻底解决微软EDGE浏览器新建标签页后出现Bing搜索框
  16. 处理器仿存带宽_存储系统性能 - 带宽计算
  17. InfluxDB使用教程:数据库管理工具InfluxDBStudio
  18. 为什么要进行实名认证?如何实名认证?
  19. 内卷老员工之三级缓存和伪共享
  20. Android 自定义 HorizontalScrollView 横向滑动效果

热门文章

  1. EUI学习之自定义皮肤
  2. 让 P-value 更加的浅显易懂
  3. clusters(clusters)
  4. 软件开发实习做什么_为什么要有开发人员实习时间
  5. Crashing Balloon
  6. 写在最后——如何做好一个语音助手
  7. mysql网游单机架设_网游单机架设直观教程终结版.doc
  8. AI 成野生动物保护神:没有图像识别算法,考拉可能灭绝!
  9. dpi、ppi、apm是什么
  10. 概率论与数理统计知识框架梳理