2016-03-31 21 views
2

5 tablodan oluşan bir sonuç kümesi oluşturmak için 3 tabloyu sorguladığım büyük bir SQL Server 2012 veritabanım var.Iterative Union TÜMÜ

Bu sorguyu bir WHILE döngüsünde ve her döngüde elde edilen sonuç kümelerini "UNION ALL" içinde tekrarlamak istiyorum. Bu yineleme, son 6 yıl içinde artacak ve bugünün tarihinde duracak olan @this_date değişkeninde olacaktır. Her yinelemede, SELECT tarafından farklı bir sonuç kümesi elde edilecektir. Yukarıdaki

Declare @the_date as Date, 
     @to_date as Date 

-- I setup the above dates, @the_date being 6 years behind @to_date 
-- Want to loop for each day over the 6-year period 


WHILE (@the_date <= @to_date) 
BEGIN 

-- the basic select query looks like this 

Select Table1.Field-1, Table2.Field-2 ... 
FROM Table1 
Inner Join Table2 ... 
On (..etc.. ) 

-- the JOIN conditions are based on table.attributes which are compared with 
-- @the_date to get a different result set each time 

-- now move the date up by 1 

DateAdd(Day, +1, @the_date) 

-- want to concatenate the result sets 

UNION ALL 
END 

bana bir sözdizimi hatası verir:

Yani şöyle saklı yordam kod çalışıyorum

Incorrect syntax near the keyword 'Union'.

benim soruna bir çözüm üzerinde herhangi fikirleri hoş olurdu - Teşekkürler.

+0

Döngüden elde edilen sonucu değişken bir tabloya ekleyin ve bundan seçim yapın. – artm

+0

Neyi başarmak istiyorsunuz? Kayıtları @ this_date'den ve 6 sene geçmeden mi almak istiyorsunuz? Amacınızı açık bir şekilde ifade ederseniz, herhangi bir döngü içermeyen bir cevap verebilirim. –

+0

'@ this_date' sorgunuzda nasıl kullanılır? – Squirrel

cevap

1

UNION kullanmayın. Zaten bir döngüde olamazsın. Bunun yerine, her yineleme sonucunu geçici bir tabloda veya bir tablo değişkeninde saklayın ve bunun yerine geçici tablo/tablo değişkeninden seçin. Eğer bazı örnek veri sağlamak ve daha verimli bir set tabanlı bir çözüm ile size yardımcı olabilecek sonuçları beklendiği takdirde, söz konusu

DECLARE @the_date as Date, 
     @to_date as Date 

CREATE TABLE #t (Col1 VARCHAR(100)) 

WHILE (@the_date <= @to_date) 
BEGIN 
    INSERT #t (Col1) SELECT ... etc 
    DateAdd(Day, +1, @the_date) 
END 

SELECT Col1 FROM #t 

. Mümkün olduğunda RDBMS'de yinelemeli döngüden kaçınmalısınız.

+0

#Temp tabloyu kullanarak çözümüm var - teşekkürler. – MaxR