8.9. ROWNUM

ROWNUM是像Oracle的ROWNUM一样的伪列。伪列的行为类似于表列,但实际上并没有存储在表中。您可以从伪列中进行选择,但无法插入、更新或删除它们的值。伪列也类似于没有参数的函数。然而,没有参数的函数通常对结果集中的每一行返回相同的值,而伪列通常对每一行返回不同的值。

对于查询返回的每一行,ROWNUM伪列返回一个数字,指示LightDB从表或一组连接行中选择行的顺序。第一行选择的ROWNUM为1,第二行为2,以此类推。

您可以使用ROWNUM来限制查询返回的行数,就像这个例子中一样:

SELECT * from employees WHERE ROWNUM < 10;

如果在同一查询中,在ROWNUM之后有一个ORDER BY子句,那么行将按ORDER BY子句重新排序。

SELECT * FROM employees WHERE ROWNUM < 11 ORDER BY last_name;

如果您将ORDER BY子句嵌入子查询中,并将ROWNUM条件放置在顶层查询中,则可以强制在对行进行排序之后应用ROWNUM条件。例如,以下查询返回具有最小的10个员工编号的员工。这有时被称为top-N报告:

SELECT * FROM
    (SELECT * FROM employees ORDER BY employee_id)
    WHERE ROWNUM < 11;

在上面的例子中,ROWNUM值是顶层SELECT语句的值,因此它们是在子查询中按employee_id排序后生成的。

测试ROWNUM值是否大于正整数的条件始终为false。例如,以下查询不返回任何行:

SELECT * FROM employees WHERE ROWNUM > 1;

获取的第一行被分配一个ROWNUM为1,并使条件为false。要获取的第二行现在是第一行,并且也被分配一个ROWNUM为1,并使条件为false。随后的所有行都无法满足条件,因此不返回任何行。

您也可以在UPDATEDELETE语句中像在SELECT语句中一样使用ROWNUM

UPDATE employees SET employee_id = 0 WHERE ROWNUM < 10;
DELETE FROM employees WHERE ROWNUM < 10;

请注意,ROWNUM在canopy中不受支持。如果您在canopy中有时称之为top-N报告,请考虑改用limit。