4

このようなテーブルを持つ:

FromKey | ToKey | Value
------------------------
 1      |  4    | AAA 
 5      |  6    | BBB

次の結果を得る最も効率的な方法は何ですか?

Key  | Value
-----------------
 1   | AAA 
 2   | AAA 
 3   | AAA 
 4   | AAA 
 5   | BBB 
 6   | BBB

テーブル関数とCROSSAPPLYを使用してそれを行う方法は知っていますが、大きなテーブルの場合、そのアプローチは遅くなります。もっと速い解決策があるのだろうか。

4

3 に答える 3

4

試してみる1つの方法は次のとおりです(完全な例、そのまま実行可能):

-- Dummy data
DECLARE @Data TABLE (FromKey INTEGER, ToKey INTEGER, Value VARCHAR(10))
INSERT @Data VALUES (1,4,'AAA'),(5,6,'BBB')

-- table of numbers, 1-100 for demo purposes
DECLARE @Numbers TABLE (Num INTEGER PRIMARY KEY)
INSERT @Numbers
SELECT TOP 100 ROW_NUMBER() OVER (ORDER BY object_id)
FROM sys.objects

SELECT n.Num, d.Value
FROM @Data d
    JOIN @Numbers n ON d.FromKey <= n.Num AND d.ToKey >= n.Num

私が行うことは、データベースに物理的な「数値」テーブルを作成し、1からnまでの数値を入力することです。ここでnは、ニーズを満たすのに十分な数です。これは1回限りのテーブル/データの作成になりますが、その場合、テーブルは上記のような目的に使用できます。

于 2012-04-18T08:38:03.113 に答える
1

これは、FromKeyとToKeyの差が2047未満である限り機能します

declare @t table(FromKey int, ToKey int, Value varchar(3))
insert @t values(1,4, 'AAA'), (5,6, 'BBB')

select t.ToKey  - m.number [Key], t.Value 
from @t t
join
master..spt_values m ON type = 'P' AND number <= ToKey - FromKey
order by 1

再帰的な解決策は次のとおりです。

declare @t table(FromKey int, ToKey int, Value varchar(3))
insert @t values(1,4, 'AAA'), (5,6, 'BBB')

;with a as
(
select FromKey [Key], ToKey,  Value from @t
union all
select [Key] + 1, ToKey, Value from a
where [Key] < ToKey
)
select [Key], Value from a
order by 1
于 2012-04-18T09:15:49.760 に答える
1
declare @t table
(
FromKey int,
ToKey int,
Value  varchar(10)
)

insert into @t values(1,4,'AAA')
insert into @t values(6,9,'BBB');
with tab as 
( 
 select FromKey , ToKey,  Value from @t 
 union all 
 select FromKey + 1, ToKey, Value 
 from tab where FromKey < ToKey 
) 
 select FromKey, Value from tab order by 1
于 2012-04-18T12:24:48.720 に答える