2

私はこのSQLの問題で立ち往生しています。

開始点のリストである列 ( prevdoc) と、開始点の後に必要な連続番号の数をリストする別の列 ( exdiff) があります。

たとえば、最初の数行は次のとおりです。

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 を指定していませんが、それぞれに連続番号のソースがあります。たとえば、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 に答える