伪列
伪列的行为与普通的列十分相似,但伪列的值并非与表存储在一起。用户可以使用 SELECT 来选择伪列,但不能对伪列进行任何的修改。伪列与不带参数的函数十分相似,但没有参数的函数其函数返回结果对于结果集中每条记录一般都是固定不变的,而伪列对于同一记录集在不同查询条件下所返回的结果可能是不相等的。
ROWNUM 伪列
ROWNUM 伪列返回一个数值指示该条记录在 KingbaseES 从表取得或连接产生时的顺序。第一条被选择的记录的 ROWNUM 值是1,第二条的值是2,以此类推。
可以使用 ROWNUM 来限制查询返回的记录数量:
create table student(sno int, name varchar(10), birthday date, department varchar(10), sex varchar(10)); insert into student values(1, 'li', '2018-1-1', 'physics', 'boy'); insert into student values(5, 'lu', '2018-1-2', 'chinese', 'boy'); insert into student values(3, 'wang', '2018-1-3', 'english', 'girl'); insert into student values(4, 'zhang', '2018-1-4', 'history', 'boy'); insert into student values(2, 'jack', '2018-1-5', 'history', 'boy'); select name from student where rownum < 5; NAME ------- li lu wang zhang (4 rows)
在查询语句中,如果使用 ORDER BY 进行排序,那么查询的结果将会被 ORDER BY 重新排列。最终的结果将根据 KingbaseES访问记录的顺序不同而改变。例如:
select name from student where rownum < 5 order by sno; NAME ------- li wang zhang lu (4 rows)
如果将 ORDER BY 嵌入到子查询中,并将 ROWNUM 的条件放在上层查询中,就可以强制 ROWNUM 条件在结果集被排序后被应用。例如下面的例子将会返回四个最小的学号。通常这也被称为 TOP-N 报表:
select name from (select name from student order by sno) as foo where rownum < 5; NAME ------- li jack wang zhang (4 rows)
在上面的例子中,ROWNUM 的值是属于上层 SELECT 语句的,也就是说它们是在子查询对学号进行排序后生成的。
测试 ROWNUM 的值大于任何一个正数的返回结果都是 false。例如,下面的查询不会返回任何记录:
select * from student where rownum > 1; SNO | NAME | BIRTHDAY | DEPARTMENT | SEX -----+------+----------+------------+----- (0 rows)
第一条被取得的元组的 ROWNUM 被赋予1,这将会导致上面的条件测试返回 false。第二条被取得的元组就成为新的第一条元组,因此 ROWNUM 还将被赋予1,条件测试的结果依然是 false。因此上面的查询语句没有任何结果返回。
可以将 ROWNUM 作为唯一值赋予表中的所有元组:
CREATE TABLE t_rownum(c INT); INSERT INTO t_rownum VALUES(0); INSERT INTO t_rownum VALUES(0); INSERT INTO t_rownum VALUES(0); UPDATE t_rownum SET c = ROWNUM; SELECT * FROM t_rownum; C --- 1 2 3
ROWNUM 伪列是为了兼容 Oracle 数据库而添加的。