改变重复的领域

时间:2011-08-15 19:05:08

标签: sql sql-server linq sql-server-2005 sql-server-2008

表:tbl1

字段:idname

id       name
1        a
1        a
1        a
1        b

我喜欢重复名称和Id的地方(id = 1,name = a || id = 1,name = a || id = 1,name = a)。

更改为

id = 1,name = a1 || id = 1,name = a2 || ID = 1,名称= A3

Linq&& SqlServer的

1 个答案:

答案 0 :(得分:1)

请注意,这是我解释问题含义的最佳尝试。如果我离开基地,请回复:)我提出了一个使用一次性SQL查询来更新输出的解决方案,因为这对于LINQ解决方案来说可能有点过于复杂。

这是一个查询,它将生成一个id和名称表,只要id和name相同,名称就会附加一个索引值。它的工作原理是生成行号并计算相同的值。如果相同值的计数大于1,则行号用于生成附加到名称的索引。请注意,这不能修改现有表,因为当没有唯一标识符时,无法以这种方式更新记录。您必须将其输出到新表中并使用它:

;with T as (
    select
        row_number() over (order by id, name) as idx,
        id,
        name,
        (select count(*) from [tbl1] b where b.id=a.id and b.name=a.name) as count
    from
        [tbl1] a
)
select
    id,
    case when
        count > 1 then
            name + 
                cast(
                    (select count(*) from T b where b.id=T.id and b.name=T.name
                        and b.idx<T.idx) + 1
                as varchar(50))
        else
            name
    end
from
    T

使用此查询,如果tbl1包含以下输入:

1   a
1   a
1   a
1   b
2   a
2   a
2   b
2   b
2   b
2   c
2   c
2   d
1   e

将生成以下输出:

1   a1
1   a2
1   a3
1   b
1   e
2   a1
2   a2
2   b1
2   b2
2   b3
2   c1
2   c2
2   d

如果这没有回答你的问题,请告诉我。希望这有帮助!