使用值更新重复列

时间:2013-11-14 19:39:09

标签: sql sql-server-2008

我的REDIRECTS表格中有一个包含CUSTOMERNAME和REDIRECTNAME列的表格,如下所示

ID    NAME        REDIRECTLINK

1    Gregory     XYUS_555
2    Sam         VYU_787
3    Smith       XYUS_555
4    John        PPIU_987

所以基本上我想更新副本并为它添加一个数字,就像史密斯应该

一样
Smith     XYUS_555_01

将照顾副本。我只是不确定如何只更新副本。我有以下内容来查找重复项:

SELECT
    REDIRECTLINK, COUNT(*) dupcount
FROM
    REDIRECTS
WHERE 
    REDIRECTLINK IS NOT NULL
GROUP BY
    REDIRECTLINK
HAVING 
    COUNT(*) > 1

这告诉我每个重定向链接有多少重复,但是如何更新重复链接?

UPDATE REDIRECTS
SET REDIRECTLINK = REDIRECTLINK + '01" //NOT SURE HOW TO APPROACH THIS
WHERE REDIRECTLINK IN (
  SELECT REDIRECTLINK
  FROM REDIRECTS
  GROUP BY REDIRECTLINK
  HAVING ( COUNT(REDIRECTLINK) > 1 )
)

我在上面的代码上遇到了问题,因为我不确定如何将其与找到的副本相关联,而不是两者。

3 个答案:

答案 0 :(得分:1)

您可以UPDATE使用JOIN

;WITH cte AS
(
   SELECT *,
         ROW_NUMBER() OVER (PARTITION BY NAME ORDER BY Id DESC) AS rn
   FROM REDIRECTS 
)

UPDATE REDIRECTS 
SET REDIRECTLINK = REDIRECTLINK + '01' 
FROM cte
INNER JOIN REDIRECTS
    ON REDIRECTS.Id = cte.Id
WHERE cte.rn = 1;

您可以查看this post了解详情

答案 1 :(得分:1)

首先使用ROW_NUMBER()确定RedirectLink的子编号(并减去1使其从零开始)。然后在更新中使用它来更新子编号大于零的所有记录。

with NT as  (
select 
  ID,
  Row_Number() over (PARTITION BY RedirectLink ORDER BY ID)-1 as Nr
from Table1
)
update T  
  set T.RedirectLink = T.RedirectLink + '_' + cast(NT.Nr as varchar)
FROM Table1 T
JOIN NT ON (NT.ID = T.ID)
where Nr>0

答案 2 :(得分:0)

如果我理解正确,您可以使用row_number()来识别您的副本,然后更新row_number为>的那些。 1。

select
id,
redirectlink,

row_number() over (partition by redirectlink order by id)
from
table1

SQL Fiddle