#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