SQL:从不同的起点创建连续的数字列表

SQL:从不同的起点创建连续的数字列表,sql,range,sequence,sequential,gaps-and-islands,Sql,Range,Sequence,Sequential,Gaps And Islands,我被这个SQL问题困住了 我有一列是起始点prevdoc的列表,另一列列出了起始点exdiff之后我需要多少序列号 例如,以下是前几行: prevdoc | exdiff ---------------- 1 | 3 21 | 2 126 | 2 所以我需要一个输出,看起来像: 2 3 4 22 23 127 128 我甚至不知道从哪里开始。有人能告诉我这个解决方案的SQL代码吗 谢谢 如果数字不太大,则可以在大多数数据库中使用以下技巧: select

我被这个SQL问题困住了

我有一列是起始点prevdoc的列表,另一列列出了起始点exdiff之后我需要多少序列号

例如,以下是前几行:

prevdoc | exdiff
----------------    
1       | 3
21      | 2
126     | 2
所以我需要一个输出,看起来像:

2
3
4
22
23
127
128
我甚至不知道从哪里开始。有人能告诉我这个解决方案的SQL代码吗


谢谢

如果数字不太大,则可以在大多数数据库中使用以下技巧:

select t.exdiff + seqnum
from t join
     (select row_number() over (order by column_name) as seqnum
      from INFORMATION_SCHEMA.columns
     ) nums
     on t.exdiff <= seqnum
在子查询中使用信息\架构列是任意的。唯一的目的是生成一个至少与最大exdiff数相同长的数字序列


这种方法适用于任何支持排名功能的数据库。大多数数据库都有一种特定于数据库的生成序列的方法,例如SQL Server中的recursie CTE和Oracle中的CONNECT BY。

如果您的exdiff将是一个较小的数字,您可以使用SELECT..UNION ALL组成一个虚拟的数字表,如下所示并连接到该表:

;with a as
(
select prevdoc + 1 col, exdiff
from <table> where exdiff > 0
union all
select col + 1, exdiff - 1
from a
where exdiff > 1
)
select col
select prevdoc+number
from doc
join (select 1 number union all
      select 2 union all
      select 3 union all
      select 4 union all
      select 5) x on x.number <= doc.exdiff
order by 1;
我已经提供了5个,但您可以根据需要扩展。您尚未指定DBMS,但在每个DBMS中都有一个序列号源,例如在SQL Server中,您可以使用:

select prevdoc+number
from doc
join master..spt_values v on
   v.number <= doc.exdiff and
   v.number >= 1 and
   v.type = 'p'
order by 1;

当通过type='p'筛选时,master..spt_values表包含0-2047之间的数字。

您不能在子选择中引用prevdoc,因为子选择无法检测表c。交叉应用在这里看起来很混乱。因此,我开始引用新的\u id或现有列之一。大多数数据库都有一种特定于数据库的生成序列的方法,也就是PostgreSQL中名为generate\u series的函数。对不起,我知道你说这是任意的,但我对\u schema.columns的信息感到困惑。这是什么,我如何使用它?如果1是一个起点,为什么输出从2开始?好问题。我对人们能想到的东西很感兴趣。SQL操作集,即整数集,因此我们可以假设有一个比Gordon提出的更简单的解决方案。@EvilTeach:我认为这一点回答了您的问题:“在起始点exdiff之后列出我需要多少序列号的列”是我的重点。