我有一个应用程序,它可以很好地处理数据库查询输出,但现在需要在一个数字范围内运行每个输出。当然,我可以重构应用程序来遍历范围,但是如果我可以在数据库中有一个“表”,可以与我的正常查询输出交叉连接,那么它可能会更干净。当然,我可以创建一个包含一系列值的表,但这似乎是不必要的浪费。
例如,数据库中的“表”表示一系列值,例如,在名为"number“的列中表示0到999,而不必实际存储100万行,但可以在与另一个表交叉连接的查询中使用,就好像实际存在这样的表一样。
我很好奇在任何数据库实现中是否存在这样的结构。
发布于 2022-09-27 03:37:43
PostgreSQL有系列。SQLite有作为一个可加载的扩展。
SELECT * FROM generate_series(0,9);在支持递归CTE (SQLite、PostgreSQL、MariaDB)的数据库上,您可以这样做,然后与其连接。
WITH RECURSIVE cnt(x) AS (
VALUES(0)
UNION ALL
SELECT x+1 FROM cnt WHERE x < 1000000
)
SELECT x FROM cnt;初始的select首先运行,然后返回一个列"1“的一行。这一行被添加到队列中。在步骤2a中,从队列中提取一行并添加到"cnt“中。然后按照步骤2c运行递归选择,生成一个值为"2“的新行,以将其添加到队列中。队列仍然有一行,因此步骤2重复。"2“行由步骤2a和2b提取并添加到递归表中。然后,将包含2的行用作递归表的完整内容,并再次运行递归选择,从而将值为"3“的行添加到队列中。这重复999999次,直到最后在步骤2a,队列上的唯一值是包含1000000的行。提取该行并将其添加到递归表中。但是这一次,WHERE子句导致递归-select不返回任何行,因此队列保持为空,递归停止。
发布于 2022-09-27 03:35:58
我的问题的答案是“是否有任何数据库实现允许表不包含数据,但在查询时生成数据?”是的。例如,在sqlite中存在虚拟表:https://www.sqlite.org/vtab.html
事实上,它就像我在generate_series中所寻找的那样:https://www.sqlite.org/series.html
发布于 2022-09-27 03:20:18
一般来说,这在很大程度上取决于您正在使用的数据库。例如,在SQLite中,您将生成从1到100的序列。你可以这样编码:
WITH basic(i) AS (
VALUES(1)
),
seq(i) AS (
SELECT i FROM basic
UNION ALL
SELECT i + 1 FROM seq WHERE i < 100
)
SELECT * FROM seq;希望按下你的铃铛。
https://stackoverflow.com/questions/73861933
复制相似问题