2012-03-30 21 views
2

私は以下のレコードを返すCTEを持っています。 GID = NULLのすべてのレコードが前の最後のGIDを取得するように、新しいクエリをどのように進めるべきですか?tsql - 自己参照

ID GID  VALUE 
1 1  Some Value 
2 NULL Some Value 
3 2  Some Value 
4 3  Some Value 
5 NULL Some Value 
6 NULL Some Value 

例: ID 5と6のレコードが= 3

答えて

3
with C(ID, GID, VALUE) as 
(
    select 1, 1,  'Some Value' union all 
    select 2, NULL, 'Some Value' union all 
    select 3, 2,  'Some Value' union all 
    select 4, 3,  'Some Value' union all 
    select 5, NULL, 'Some Value' union all 
    select 6, NULL, 'Some Value' 
) 

select C1.ID, 
     C3.GID, 
     C1.VALUE 
from C as C1 
    cross apply 
    (select top 1 C2.ID, C2.GID 
    from C as C2 
    where C2.ID <= C1.ID and 
      C2.GID is not null 
    order by C2.ID desc) as C3 
1
;WITH C(ID, GID, VALUE) as 
(
    select 1, 1,  'Some Value' union all 
    select 2, NULL, 'Some Value' union all 
    select 3, 2,  'Some Value' union all 
    select 4, 3,  'Some Value' union all 
    select 5, NULL, 'Some Value' union all 
    select 6, NULL, 'Some Value' 
) 
select c.id, d.GID, c.value from c 
cross apply 
(select max(GID) GID from c d where c.id >= id) d 
+0

GIDを持っています私のソリューションは、それが全く明らかではありません –

+0

正しくありませんが、私は今、それを参照してください。あなたはおそらく自分自身にダウンボートを与えるべきです。 :) –