Postgresql13之FETCH FIRST ROWS … WITH TIES展示打结的行
也算是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展示打结的行相关推荐
- 12c分页查询特性FETCH FIRST ROWS,OFFSET ROWS FETCH NEXT ROW LIMIT Clause子句
Database 12c的FETCH FIRST ROWS特性可以简化老版本中ROW_NUM()或ROWNUM的分页排序写法, 大幅节约开发花在分页查询语句上的时间. row-limiting子句用以 ...
- 解决列表某项文字过度过多 需要自适应撑开高度展示 其他项目按照行高居中
解决列表某项文字过度过多 需要自适应撑开高度展示 其他项目按照行高居中 以下代码可直接复制: 两种方法:分别是方法1:bfc配合浮动撑高 其他项目子绝父相 方法二:第一项也是相对定位(不推荐) < ...
- Oracle高级数据库复习
考试大纲 文章目录 ==考试大纲== ==分章考点== 第三章.Oracle数据库系统结构 图:数据库系统结构内部关系 第四章.数据库设计 第五章.数据库存储设置与管理 表空间的设置与管理(要记sql ...
- 查找行迁移及消除行迁移(chained rows)
转自http://blog.csdn.net/leshami/article/details/7266719 一.概述: 如果你的Oracle数据库性能低下,行链接和行迁移可能是其中的原因之一.我 ...
- oracle fetch into语法,Oracle Fetch
oracle函数 的 Oracle Fetch 在本教程中,将学习如何使用Oracle FETCH子句来限制查询返回的行数. Oracle FETCH子句简介 一些RDBMS(如和)使用子句来检索查询 ...
- Oracle/PLSQL FETCH Statement
分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! Orac ...
- 精确实现popover效果:内容超出容器则tooltips+popover展示,反之无效果
前端中对于:"文字超出tooltip展示,鼠标滑过气泡展示所有内容",这样的需求是很常见的,element-ui也有专门的组件el-popover组件支持类似需求的实现 要实现这样 ...
- ExtJS grid简单应用之 展示JSON数据
Grid功能: 展示json数据,编辑行,排序,分页.分页功能要根据请求URL的参数,在服务器端返回相应JSON,此处服务端未写.(url参数,可通过firebug控制台查看) 1,首先引用 < ...
- PyQt5 技巧篇-复选框绑定行内容,全选、清空、展示选中的内容功能实现演示,设置复选框选中,检查复选框选中状态
先看效果图,选中了几行,然后将选中的内容展示出来. 我设置两个有序序列,分别存储对应的复选框和行内容. 我的行内容是用的 label 标签. # 存储右边label组件的有序列表def get_L_b ...
- Go + Excel 学习 Excelize rows.go
Copyright 2016 - 2019 The excelize Authors. 版权所有2016-2019优秀作者. All rights reserved. 保留所有权利. Use of t ...
最新文章
- zabbix 监控项自动发现过滤_Zabbix5.2由浅入深之官方自动发现规则初探(网络篇)
- js 定时任务,定时器
- android中volley通信框架简介
- Python(迭代、三元表达式、列表生成、生成器、迭代器)
- 8.17——继续熟悉linux的命令行
- Effective.Java第23-33条(泛型相关)
- python二维码生成器制作中报错为oserror_Python生成:OSError:[WinError 193]%1不是有效的Win32应用程序...
- java spring hiberate_Java程序员:Spring Boot和Hibernate一起使用的技巧
- AutoLISP绘制圆DCL对话框
- Python初学16——程序设计方法学
- 对计算机专业的认识和未来规划,对计算机专业的认识及学业规划
- 处理器仿存带宽_CPU,内存,主板带宽是怎么计算的?网上帖子说内存和主板的带宽要大于等于CPU带宽,充分利用CPU...
- 使用 Anaconda 安装 Pytorch
- 商品的价格术语(外贸知识三)
- 彻底解决微软EDGE浏览器新建标签页后出现Bing搜索框
- 处理器仿存带宽_存储系统性能 - 带宽计算
- InfluxDB使用教程:数据库管理工具InfluxDBStudio
- 为什么要进行实名认证?如何实名认证?
- 内卷老员工之三级缓存和伪共享
- Android 自定义 HorizontalScrollView 横向滑动效果