2

我被困在这个 SQL 问题上。

我有一列是起点列表prevdocexdiff

例如,这里是前几行:

prevdoc | exdiff
----------------    
1       | 3
21      | 2
126     | 2

所以我需要一个输出看起来像:

2
3
4
22
23
127
128

我什至不知道从哪里开始。谁能告诉我这个解决方案的 SQL 代码?

谢谢!

4

3 回答 3

1
;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
于 2012-10-06T19:27:26.910 回答
1

如果您的 exdiff 将是一个小数字,您可以使用SELECT..UNION ALL如下所示的方式组成一个虚拟数字表并加入它:

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;

master..spt_values 表包含 0-2047 之间的数字(按 type='p' 过滤时)。

于 2012-10-06T21:41:49.597 回答
0

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

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

在子查询中使用 INFORMATION_SCHEMA 列是任意的。唯一的目的是生成至少与最大 exdiff 数一样长的数字序列。

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

于 2012-10-06T19:26:53.620 回答