Обновление записей в таблице1 на основе дубликатов в Таблице2

#sql #sql-server #tsql

#sql #sql-сервер #tsql

Вопрос:

Я пытаюсь работать над этим уже несколько дней, и я не могу найти правильное решение.

У меня есть 2 таблицы:

-Adgroups: содержит список adgroups с их уникальным идентификатором adGroupId и именем AdgroupName. В этой таблице дублируются имена.

-Adgroup_Campaigns: содержит список кампаний с уникальным идентификатором CampaignID и уникальным идентификатором группы из table1.

Что мне нужно сделать, так это найти все дублирующиеся имена в таблицах Adgroups, что я и делаю с помощью следующего запроса:

 SELECT
    o.[AdGroup_Id], o.[AdGroup]
FROM (
    SELECT [AdGroup], COUNT(*) as intCount
    FROM [dbo].[AdGroup]
    GROUP BY [AdGroup]
    HAVING COUNT(*) > 1
    )
AS d
INNER JOIN [dbo].[AdGroup] o ON o.[AdGroup] = d.[AdGroup]
  

Это возвращает список типа:

 Adgroup_Id   AdGroup      
----------- ----------
1           PRE-MAS--v2-LP2      
2           PRE-MAS--v2-LP2      
5           PRE-MAS--v2-LP2       
6           UNI-A-v2-LP2
8           UNI-A-v2-LP2
10          UNI-A-v2-LP2
16          PRE-UNI-v2-LP2
17          PRE-UNI-v2-LP2
20          PRE-UNI-v2-LP2
  

Теперь я перепроверяю в таблице Adgroup_Campaigns все записи, adGroupId которых находится в списке дублированных adgroups, что я делаю со следующим запросом:

 SELECT * FROM 
(
    SELECT
        o.[AdGroup_Id], o.[AdGroup]
    FROM (
        SELECT [AdGroup], COUNT(*) as intCount
        FROM [dbo].[AdGroup]
        GROUP BY [AdGroup]
        HAVING COUNT(*) > 1
        )
    AS d
    INNER JOIN [dbo].[AdGroup] o ON o.[AdGroup] = d.[AdGroup]
)
AS x INNER JOIN [dbo].[AdGroupCampaignMapper] t
ON t.[AdGroup_Id] = x.[AdGroup_Id]
  

Который возвращает список типа:

 Adgroup_Id   AdGroup         Campaign_Id      
----------- ---------        ------------
1           PRE-MAS--v2-LP2  1    
2           PRE-MAS--v2-LP2  3    
5           PRE-MAS--v2-LP2  5     
6           UNI-A-v2-LP2     6
8           UNI-A-v2-LP2     7
10          UNI-A-v2-LP2     8
16          PRE-UNI-v2-LP2   9
17          PRE-UNI-v2-LP2   10
20          PRE-UNI-v2-LP2   11
  

Итак, что мне нужно, так это запрос, который фактически обновит поля Adgroup_Id в таблице Adgroup_Campaigns, чтобы каждая группа дубликатов имела в качестве Adgroup_Id первый идентификатор этой группы примерно так:

 Adgroup_Id   AdGroup         Campaign_Id      
----------- ---------        ------------
1           PRE-MAS--v2-LP2  1    
1           PRE-MAS--v2-LP2  3    
1           PRE-MAS--v2-LP2  5     
6           UNI-A-v2-LP2     6
6           UNI-A-v2-LP2     7
6           UNI-A-v2-LP2     8
16          PRE-UNI-v2-LP2   9
16          PRE-UNI-v2-LP2   10
16          PRE-UNI-v2-LP2   11
  

Любая помощь была бы высоко оценена.

Ответ №1:

Вы могли бы использовать обновление с внутренним соединением

 update  a 
set  AdGroupCampaignMapper.Adgoup_Id = t.min_id
FROM  [dbo].[AdGroupCampaignMapper]  as a
INNER JOIN ( 
   SELECT  [AdGroup] , min([AdGroup_Id]) min_id, COUNT(*) as intCount
        FROM [dbo].[AdGroup]
        GROUP BY [AdGroup]
      HAVING COUNT(*) > 1  ) t on . t.AdGroup = a.AdGroup 
  

Комментарии:

1. Спасибо, но на самом деле это не работает, это позволит выбрать минимальный AdGroup_Id из всех групп объявлений и поместить его во все кампании (тестировал сам).

2. @victorgonal … извините, не тот столбец.. я обновил ответ, используя Adgroup_id