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