2011-07-07 28 views
6

Bir ana nesnenin bazı alt öğeleri olan bir tablom var. Her çocuk birden fazla kez oluşabilir ve bu sayıyı içeren bir zuhurları sütun vardır, bu nedenle tablodaki veriler gibi bir şey: her çocukla,Aynı satırın birden çok kez seçilmesi

ChildID | ParentID | Occurences 
------------------------------- 
     1 |  1 |  2 
     2 |  1 |  2 
     3 |  2 |  1 
     4 |  2 |  3 

Ben tüm çocukların bir listesini almak gerekir gibi sonucundaki kez corect sayısını görünen şey

IDENT | ChildID | ParentID 
-------------------------- 
    1 |  1 |  1 
    2 |  1 |  1 
    3 |  2 |  1 
    4 |  2 |  1 
    5 |  3 |  2 
    6 |  4 |  2 
    7 |  4 |  2 
    8 |  4 |  2 
Masayı döngüler ve gerekli görüldüğünde kadar satır ekleyen bir imleç ile yapabilirsiniz, ama bu en iyi çözüm olduğunu sanmıyorum

mümkün. yardım

sayesinde


oluşturma komut şunlardır:

DECLARE @Children TABLE (ChildID int, ParentID int, Occurences int) 

INSERT @Children 
SELECT 1, 1, 2 UNION ALL 
SELECT 2, 1, 2 UNION ALL 
SELECT 3, 2, 1 UNION ALL 
SELECT 4, 2, 3 
+1

Bunu neden sormanız gerektiğini sorarsam sorun olur mu? Belki de aynı satırı birkaç kez seçmekten daha iyi bir yol vardır. – EdoDodo

+0

Her çocuk için bir satır oluşturmam gerekiyor çünkü farklı olabilecek bazı ek veriler var. – SWeko

cevap

7
;with C as 
(
    select ChildID, 
     ParentID, 
     Occurences - 1 as Occurences 
    from @Children 
    union all 
    select ChildID, 
     ParentID, 
     Occurences - 1 as Occurences 
    from C 
    where Occurences > 0 
) 
select row_number() over(order by ChildID) as IDENT, 
     ChildID, 
     ParentID 
from C 
order by IDENT 
+0

Thx, bu hile – SWeko

+0

müthiş bir hile yaptı – SMK

+0

Benim durumumda, Vaka sayısı küçük (10 üstleri) ama sayı yüzlerce ise, bu özyineleme sınırını aşacaktır. – SWeko

4
;WITH CTEs 
AS 
(
    SELECT 1 [Id] 
    UNION ALL 
    SELECT [Id] + 1 FROM CTEs WHERE [Id] < 100 
) 
SELECT ROW_NUMBER() OVER(ORDER BY c1.ChildID, c1.ParentID) [rn] 
    , c1.ChildID, c1.ParentID 
FROM CTEs ct 
JOIN @Children c1 ON c1.Occurences >= ct.[Id] 

dizisi üretmek için başka bir yolu, örneğin, önceden belirlenmiş bir tablo kullanılarak bir master.dbo.spt_values:

SELECT ROW_NUMBER() OVER(ORDER BY c1.ChildID, c1.ParentID) [rn] 
    , c1.ChildID, c1.ParentID 
FROM master.dbo.spt_values ct 
JOIN @Children c1 ON c1.Occurences > ct.number 
    AND ct.type = 'P' 
+0

Cool, bu temelde kaynak tabloyu bir sayı tablosuyla birleştirir ve hoş bir katılım koşuluyla. – SWeko

+0

Benim durumumda, Durum sayısı küçük (10 üst) ama sayı yüzlerce ise, bu özyineleme sınırını aşacaktır. Sayı tablosu önceden oluşturulmuşsa, bu seçenek tersine çevrilebilir. – SWeko

+0

veya "seçenek (MAXRECURSION 0)" ile yan yana –

İlgili konular