2015-05-14 21 views
3

说我的ID,名称表并标记字段的更新内容如下:追加本地字符的字符串时,重复发现

+----+-------+---------+ 
| ID | Name | Update? | 
+----+-------+---------+ 
| 1 | A  | y  | 
| 2 | B  | y  | 
| 3 | xxB |   | 
| 4 | C  |   | 
| 5 | D  | y  | 
| 6 | xxD |   | 
| 7 | xxxD |   | 
| 8 | E  |   | 
+----+-------+---------+ 

“更新”是追加一个“XX”的名称,但是在表中不能有重复的名称,所以我想追加一个额外的'x'找到任何重复。因此,对于这一个表将更新到这一点:

+----+-------+---------+ 
| ID | Name | Update? | 
+----+-------+---------+ 
| 1 | xxA |   | 
| 2 | xxB |   | 
| 3 | xxxB |   | 
| 4 | C  |   | 
| 5 | xxD |   | 
| 6 | xxxD |   | 
| 7 | xxxxD |   | 
| 8 | E  |   | 
+----+-------+---------+ 

上做到这一点的最好办法的任何想法?它的更新会在最初更新时发生,而且我不知道它是多么容易让它检查并更新所有级别的重复,例如A不重复, b为1个电平,d是2级等

谢谢, 戴夫

+0

当你想要A到XXA然后E也是XXE时,你确切地想要什么......但是你已经提到过E – mohan111

回答

2

尝试这一个:

SQL Fiddle

WITH CteUpdate AS(
    SELECT *, 
     base = REPLACE(Name, 'x', ''), 
     xxName = REPLICATE('x', 
        ROW_NUMBER() OVER(
         PARTITION BY REPLACE(Name, 'x', '') 
         ORDER BY ID 
        ) + 1 
       ) + REPLACE(Name, 'x', '') 
    FROM TestData 
    WHERE 
     REPLACE(Name, 'x', '') IN(
      SELECT Name FROM TestData WHERE [Update] = 1 
     ) 
) 
UPDATE CteUpdate 
    SET Name = xxName 
     , [Update] = 0 

结果

ID   Name  Update 
----------- ---------- ------ 
1   xxA  0 
2   xxB  0 
3   xxxB  0 
4   C   0 
5   xxD  0 
6   xxxD  0 
7   xxxxD  0 
8   E   0 

首先,你想有与Update = 1这些行相同的基本Name(该Name减去xx S)的所有行。为了获得基础Name,只是''替换x

SELECT *, 
    base = REPLACE(Name, 'x', '') 
FROM TestData 
WHERE 
    REPLACE(Name, 'x', '') IN(
     SELECT Name FROM TestData WHERE [Update] = 1 
    ) 

的结果将是:

ID   Name  Update base 
----------- ---------- ------ ------ 
1   A   1  A 
2   B   1  B 
3   xxB  0  B 
5   D   1  D 
6   xxD  0  D 
7   xxxD  0  D 

然后,你要使用ROW_NUMBER OVER(PARTITION BY base ORDER BY ID)。将所得ROW_NUMBER + 1将要对所述查询的所述base

WITH CteUpdate AS(
    SELECT *, 
     base = CAST(REPLACE(Name, 'x', '') AS VARCHAR(1)) 
    FROM TestData 
    WHERE 
     REPLACE(Name, 'x', '') IN(
      SELECT Name FROM TestData WHERE [Update] = 1 
     ) 
) 
SELECT 
    RN = ROW_NUMBER() OVER(PARTITION BY base ORDER BY ID), 
    xxName = REPLICATE('x', ROW_NUMBER() OVER(PARTITION BY base ORDER BY ID) + 1) + base 
FROM CteUpdate 

结果加入x S中的数目将是:

ID   Name  Update base RN xxName 
----------- ---------- ------ ------ ----- --------- 
1   A   1  A  1  xxA 
2   B   1  B  1  xxB 
3   xxB  0  B  2  xxxB 
5   D   1  D  1  xxD 
6   xxD  0  D  2  xxxD 
7   xxxD  0  D  3  xxxxD 

xxName现在将更新的Name

+0

感谢你的好解释!我会放弃它。 –

+0

没问题。随意问任何问题。 –