【问题标题】:How do I generate a (dummy) column of arbitrary length with MonetDB?如何使用 MonetDB 生成任意长度的(虚拟)列?
【发布时间】:2014-06-01 08:27:42
【问题描述】:

我想运行相当于 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 月的版本。也欢迎提供有关更新功能的答案,但这正是我正在寻找的。 - 假设现有表格没有足够的行数;并且不要假设,例如,最长表的笛卡尔积与自身就足够了(或者,可能执行起来成本太高)。

【问题讨论】:

  • 不熟悉 MonetDB,但看起来有人在两周前向源代码提交了generate_series function。你可以从源代码构建并使用它吗?
  • @IainElder:已编辑以解决此问题。
  • 您打算如何处理这些值?如果您需要将 100 亿个连续值用作主键,则有更好的方法来生成这些值。提供更多背景信息,以便我们更好地帮助您。

标签: sql idioms monetdb data-generation


【解决方案1】:

尝试:

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

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

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

SELECT rand();

【讨论】:

  • 那么,您是说这是 2015 年 7 月版本的新功能?还是最近才变得不稳定?
  • 不,它在以前的版本中也可用,看起来有时不稳定,但可能是我的实例的内存限制。
【解决方案2】:

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

【讨论】:

  • 是的,它们确实是……但是,无论我需要生成 10 条记录还是 10,000,000,000 条记录,我都希望 same 查询能够正常工作。
  • 要仅使用一个查询,请提前了解您将需要的最多行数以及源表中的行数。编写一个具有最少自连接数的查询,以至少生成最大数量。如果您永远不需要超过 100 亿行,而源表包含 1000 行,则需要一个引用源四次的查询。在数字上,1000 ^ 3 &lt; 10 billion &lt; 1000 ^ 4。如果您决定想要更多,请添加另一个联接。最终你会耗尽时间、空间、金钱或耐心来处理它,到那时它可能已经足够大了:-)
猜你喜欢
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多