2012-02-24 9 views
1

私のクエリは、私のテーブルには、347000行が私の最終的な出力を得るために時間以上を取っ.itsた現在SQL Serverは:誰もが

declare @row_id int = 2 
declare @last_row_id int =(select MAX(Row_ID) from dbo.Source) 

create table #source (
    Row_ID float null, 
     [Document] [nvarchar](255) NULL,  
     [ITEMCode] [nvarchar](255) NULL,  
     [Text] [nvarchar](255) NULL) 

while(@row_id<=(@last_row_id)) 
begin 

declare @Document nvarchar(255) 
declare @itemcode nvarchar(255) 

select @itemcode=ITEMCode,@Document=Document from dbo.Source where [email protected]_id 


if ((@itemcode='' or @itemcode is null)) 
select @itemcode=ITEMCode,@Document=Document from #source where [email protected]_id-1 

insert into #source 
select Row_ID,@Document,@itemcode,[Text] 
from dbo.Source where [email protected]_id 

print @row_id 

set @row_id= @row_id+1 

end 

select * from #source 
drop table #source 

以下の通りですこのロジックを簡素化することができます。どのようにしてこのクエリをより速く行うことができます誰も助けることができますか?

要件:

出典:

Row_ID Document ITEMCode  Text     
    2  10223   20235  aaaa 
    3         bbbb 
    4         cccc 
    5  10278   202475  xxxx 
    6         yyyy 
    7         yyy 

出力は次のようになります。

Row_ID Document ITEMCode Text  
    2  10223  20235 aaaa 
    3  10223  20235 bbbb 
    4  10223  20235 cccc 
    5  10278 202475 xxxx 
    6  10278 202475 yyyy 
    7  10278 202475 yyy 
+1

#sourceに何かがある前にそれを選択しているのはなぜですか? –

+0

何かがあるときは選択しないでください。 dbo.Sourceの最初のレコードでは、ITEMCodeは空でもなく、nullでもありません。義足は初めて実行されることはありません。ループが2回目になるとき#sourceにデータがある –

+2

このコードの目的が何であるかを記述すると、より良い応答を得るでしょう。コードを読むのは難しいです。 –

答えて

0

上記の指定されたクエリが機能するかもしれませんが、私は速くnが5分以内に出力を得られるexcelでマクロを書きました

1

あなたはrecursiveCTEを使用することができます。

WITH 
    Source (Row_ID, Document, ITEMCode, Text) AS (
    SELECT 2, '10223', '20235' , 'aaaa' UNION ALL 
    SELECT 3, ''  , ''  , 'bbbb' UNION ALL 
    SELECT 4, ''  , ''  , 'cccc' UNION ALL 
    SELECT 5, '10278', '202475', 'xxxx' UNION ALL 
    SELECT 6, '10278', '202475', 'yyyy' UNION ALL 
    SELECT 7, '10278', '202475', 'yyy' 
), 
    ranked AS (
    SELECT 
     *, 
     rnk = ROW_NUMBER() OVER (ORDER BY Row_ID) 
    FROM Source 
), 
    filled AS (
    SELECT 
     Row_ID, 
     Document, 
     ITEMCode, 
     Text, 
     rnk 
    FROM ranked 
    WHERE rnk = 1 
    UNION ALL 
    SELECT 
     r.Row_ID, 
     Document = ISNULL(NULLIF(r.Document, ''), f.Document), 
     ITEMCode = ISNULL(NULLIF(r.ITEMCode, ''), f.ITEMCode), 
     r.Text, 
     r.rnk 
    FROM ranked r 
     INNER JOIN filled f ON r.rnk = f.rnk + 1 
) 
SELECT 
    Row_ID, 
    Document, 
    ITEMCode, 
    Text 
FROM filled 

出力:DocumentITEMCodeが実際に整数ではなく文字列である場合

Row_ID  Document ITEMCode Text 
----------- -------- -------- ---- 
2   10223 20235 aaaa 
3   10223 20235 bbbb 
4   10223 20235 cccc 
5   10278 202475 xxxx 
6   10278 202475 yyyy 
7   10278 202475 yyy 

、上記のスクリプトは動作しますが、一般的にはこの2行に変更した方がよいでしょう。このような

Document = ISNULL(NULLIF(r.Document, ''), f.Document), 
ITEMCode = ISNULL(NULLIF(r.ITEMCode, ''), f.ITEMCode), 

Document = ISNULL(NULLIF(r.Document, 0), f.Document), 
ITEMCode = ISNULL(NULLIF(r.ITEMCode, 0), f.ITEMCode), 
関連する問題