如何使用MonetDB生成任意长度的(虚拟)列?

时间:2014-06-01 08:27:42

标签: sql idioms monetdb data-generation

我想运行相当于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月的版本。我们也欢迎有关更多近期功能的答案,但这正是我所寻求的。 - 假设现有的桌子没有足够的线路;并且不要认为,例如,最长表的笛卡尔积与其本身就足够了(或者,可能执行成本太高)。

2 个答案:

答案 0 :(得分:1)

尝试:

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

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

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

SELECT rand();

答案 1 :(得分: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世界中也相关!

相关问题