2012-03-30 49 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条将GID = 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

我的解决方法是不正确的 – 2012-03-30 20:38:17

+0

这不是明显在所有,但现在我明白了。你可能应该给自己一个downvote。 :) – 2012-03-31 16:52:01