对不起; 我以前从未使用过 MonetDB。但是文档让我相信您可以使用ROW_NUMBER函数和像SYS.COLUMNS这样的预填充表来解决这个问题。
SELECT ROW_NUMBER() OVER () AS rownum
FROM SYS.COLUMNS;
这属于 jooq.org 的类别,即仅从“足够大”的表中获取随机记录。
PostgreSQL 的generate_series函数很优雅,但不是标准的。在 SQL Server、Oracle 和 MySQL 等其他主流引擎中是没有的。您的 MonetDB 版本也没有。
MonetDB 确实有ROW_NUMBER函数,这是标准 SQL 中的一个近似等效函数。它为结果集中的行分配一个连续的整数。它将输出正确的值,但它已经需要数据库中的一些行。鸡和蛋的问题!
SYS.COLUMNS 是一个系统元数据表,它包含数据库中每一列的一行。大多数“空”关系数据库仍然有数百个出现在此类表中的系统列。
如果第一个查询产生的行数超过您的需要,您可以将其推送到子查询中并过滤中间结果。
SELECT rownum
FROM (
SELECT ROW_NUMBER() OVER () AS rownum
FROM SYS.COLUMNS
) AS tally
WHERE rownum >= 1 AND rownum <= 10;
但是,如果您需要生成比 SYS.COLUMNS 中更多的行怎么办?不幸的是,查询的形状确实取决于您要生成多少行。
Microsoft SQL Server社区中的一个常见解决方法是将 SYS.COLUMNS 加入到自身中。这将生成一个中间表,其中包含表中行数的平方。在实践中,它可能比您需要的行数更多。
使用自联接,解决方案如下所示:
SELECT rownum
FROM (
SELECT ROW_NUMBER() OVER () AS rownum
FROM SYS.COLUMNS AS a, SYS.COLUMNS AS b
) AS tally
WHERE rownum >= 1 AND rownum <= 100000;
希望这些查询也与 MonetDB 世界相关!