2013-11-14 5 views
2

У меня есть таблица с 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) 
) 

У меня возникли проблемы с кодом выше, потому что я не уверен, как привязать его к дублируемому, а не к обоим.

+0

У вас есть ключ к этой таблице? –

+0

Я называю это «Id» - я добавил его на образец выше – user710502

+0

возможный дубликат [Обновление одиночной строки на группу] (http://stackoverflow.com/questions/17931760/updating-single-row-per-group) –

ответ

1

Сначала определите поднабор RedirectLink, используя ROW_NUMBER() (и вычтите 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 
+0

Почему дается то же точное решение, как уже упоминалось? –

+0

Я не видел вашего решения (копия вставила мой ответ из SQL Fiddle). – user2970362

+0

Btw, это не одно и то же: set T.RedirectLink = T.RedirectLink + '_' + cast (NT.Nr as varchar) – user2970362

0

Если я правильно понимаю, вы можете использовать row_number(), чтобы определить ваши дубликаты, а затем обновить те, где row_number является> 1.

select 
id, 
redirectlink, 

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

SQL Fiddle

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 для более подробной информации

Смежные вопросы