0

我想运行相当于 PostgreSQL 的

SELECT * FROM GENERATE_SERIES(1, 10000000)

我读过这个:

http://blog.jooq.org/2013/11/19/how-to-create-a-range-from-1-to-10-in-sql/

但是那里的大多数建议并没有真正采用任意长度 - 查询取决于长度,而不是仅仅替换一个数字。此外,一些建议不适用于 MonetDB。那么,我最好的行动方案是什么(如果有的话)?

注意: - 我使用的是 2013 年 2 月的版本。也欢迎提供有关更新功能的答案,但这正是我正在寻找的。- 假设现有表格没有足够的行数;并且不要假设,例如,最长表的笛卡尔乘积与自身就足够了(或者,可能执行起来成本太高)。

4

2 回答 2

1

尝试:

SELECT value
FROM sys.generate_series(initial_value, end_value, offset);

我必须报告该功能在 2015 年 7 月发布时非常不稳定,因为这会导致服务器进程崩溃。希望你有更好的运气。

如果要生成任意数值,可以使用:

SELECT rand();
于 2015-09-01T20:00:25.697 回答
0

对不起; 我以前从未使用过 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 世界相关!

于 2014-06-01T09:40:34.110 回答