2

我的 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

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

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 )
)

我在上面的代码上遇到问题,因为我不确定如何将它链接到找到的重复项,而不是两者。

4

3 回答 3

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
于 2013-11-14T20:01:19.907 回答
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;

您可以查看此帖子以获取更多详细信息

于 2013-11-14T19:55:50.583 回答
0

如果我理解正确,您可以使用 row_number() 来识别您的重复项,然后更新 row_number 大于 1 的那些。

select
id,
redirectlink,

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

SQL小提琴

于 2013-11-14T19:55:41.100 回答