You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

是否存在支持无存储查询生成数据的虚拟表的数据库实现?

无需物理表生成数值范围的数据库实现方案

很多主流数据库都支持生成虚拟的数值范围集合,能直接和其他表做CROSS JOIN,完全不用创建存储百万行的物理表,以下是常见数据库的实现方式:

PostgreSQL

PostgreSQL 自带generate_series函数,可以直接生成连续数值范围,支持整数、日期等类型:

-- 生成0到999999的数值序列,和目标表做CROSS JOIN
SELECT t.*, s.number
FROM your_query_result t
CROSS JOIN generate_series(0, 999999) AS s(number);

MySQL 8.0+

MySQL 8.0及以上版本可以借助递归CTE(公共表表达式)生成数值范围:

WITH RECURSIVE num_range AS (
    SELECT 0 AS number
    UNION ALL
    SELECT number + 1 FROM num_range WHERE number < 999999
)
SELECT t.*, nr.number
FROM your_query_result t
CROSS JOIN num_range nr;

注意:如果生成的范围很大(比如百万级),可能需要调整cte_max_recursion_depth参数来避免递归限制。

SQL Server

SQL Server 同样支持递归CTE生成数值范围,也可以用ROW_NUMBER()结合系统视图快速生成:

方式1:递归CTE

WITH num_range AS (
    SELECT 0 AS number
    UNION ALL
    SELECT number + 1 FROM num_range WHERE number < 999999
)
SELECT t.*, nr.number
FROM your_query_result t
CROSS JOIN num_range nr
OPTION (MAXRECURSION 0); -- 取消递归深度限制,适用于大范围生成

方式2:借助系统视图(更快生成大范围)

SELECT t.*, n.number
FROM your_query_result t
CROSS JOIN (
    SELECT TOP (1000000) ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) - 1 AS number
    FROM sys.all_columns c1
    CROSS JOIN sys.all_columns c2
) n;

Oracle

Oracle 可以用CONNECT BY层级查询生成数值范围,或者12c+支持的递归CTE:

方式1:CONNECT BY

SELECT t.*, s.number
FROM your_query_result t
CROSS JOIN (
    SELECT LEVEL - 1 AS number
    FROM dual
    CONNECT BY LEVEL <= 1000000
) s;

方式2:递归CTE(12c+)

WITH num_range(number) AS (
    SELECT 0 FROM dual
    UNION ALL
    SELECT number + 1 FROM num_range WHERE number < 999999
)
SELECT t.*, nr.number
FROM your_query_result t
CROSS JOIN num_range nr;

这些方案都是按需生成数值序列,不会在数据库中存储物理数据,完全符合你想要的简洁、低资源消耗的需求。

内容的提问来源于stack exchange,提问作者elspacedoge

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 04:10:36