Обновление и добавление повторяющихся записей в SQL Сервер T- SQL - PullRequest
0 голосов
/ 15 марта 2020

У меня ниже запрос и результаты. Может кто-нибудь помочь мне, как написать его с помощью запроса на обновление, чтобы эти дубликаты можно было переименовать как ELA1 (ELA1)~1, (ELA1)~2, (ELA1)~3

Запрос:

SELECT        
    Id, DisplayName
FROM  
    AbpOrganizationUnits
WHERE        
    (TenantId = 1) 
    AND (DisplayName IN (SELECT DisplayName
                         FROM AbpOrganizationUnits
                         WHERE (TenantId = 1)
                         GROUP BY DisplayName
                         HAVING (COUNT(DisplayName) > 1)))
ORDER BY 
    DisplayName, Id

Результат:

Id  DisplayName
--------------------
294 ELA1 (ELA1)
295 ELA1 (ELA1)
299 ELA1 (ELA1)
292 ELA2 (ELA2)
293 ELA2 (ELA2)
285 ELA3 (ELA3)
286 ELA3 (ELA3)
302 ELA4 (ELA4)
303 ELA4 (ELA4)
279 ELA5 (ELA5)
304 ELA5 (ELA5)
290 ELAK (ELAK)
291 ELAK (ELAK)
296 Math1 (Math1)
301 Math1 (Math1)
299 Math2 (Math2)
300 Math2 (Math2)
283 Math3 (Math3)
284 Math3 (Math3)
288 Math4 (Math4)
289 Math4 (Math4)
282 Math5 (Math5)
287 Math5 (Math5)
297 MathK (MathK)
298 MathK (MathK)
309 Sci1 (Sci1)
310 Sci1 (Sci1)
305 Sci2 (Sci2)
306 Sci2 (Sci2)
311 Sci3 (Sci3)
312 Sci3 (Sci3)
313 Sci4 (Sci4)
314 Sci4 (Sci4)
280 Sci5 (Sci5)
281 Sci5 (Sci5)
307 SciK (SciK)
308 SciK (SciK)

Ответы [ 2 ]

1 голос
/ 15 марта 2020

Используйте Общее табличное выражение и оконную функцию ROW_NUMBER .

;WITH cte AS (
    SELECT id, ROW_NUMBER() OVER (PARTITION BY DisplayName ORDER BY id) rownum
    FROM dbo.AbpOrganizationUnits
)
UPDATE dbo.AbpOrganizationUnits 
SET DisplayName = DisplayName + '~' + CAST(cte.rownum AS VARCHAR(25))
FROM dbo.AbpOrganizationUnits 
INNER JOIN cte ON cte.id = AbpOrganizationUnits.id
0 голосов
/ 15 марта 2020

Я думаю, логика c, которую вы хотите:

with toupdate as (
      select ou.*,
             row_number() over (partition by displayname) as seqnum,
             count(*) over (partition by displayname) as cnt
      from AbpOrganizationUnits ou
      where tenantid = 1
     )
update toupdate
    set displayname = concat(displayname, '~', seqnum)
    where cnt >= 2;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...