Это можно сделать как несколько шагов, каждое здание на следующем. Вы хотите работать со всеми именами и местами одновременно.
Во-первых, вы хотите получить счетчик количества названий, комбо-мест, поэтому группируйте по имени и месту и подсчитайте количество мест. Ваш запрос будет выглядеть так
SELECT name, place, COUNT(place) as placecount
FROM table1
GROUP BY name, place
Теперь вам нужно найти тот, у кого наибольшее количество, и первый по алфавиту в случае связей. Вы можете сделать это, выполнив ROW_NUMBER по результатам вышеупомянутого, перезапустив счетчик (разделение) по имени и упорядочив по месту, а затем по месту для разрешения связей. Используя CTE (вы также можете сделать это как подзапрос), это выглядело бы как
WITH places as (
SELECT name, place, COUNT(place) as placecount
FROM table1
GROUP BY name, place
)
SELECT name, place, ROW_NUMBER() OVER (PARTITION BY name ORDER BY placecount, place) as RN
FROM places
Если вы посмотрите на эти данные, то место, в котором вы хотите указать любое имя, должно быть в строке с RN, равным 1. Таким образом, вы можете получить окончательные данные, которые вы ищете, с помощью запроса, подобного этому
WITH places as (
SELECT name, place, COUNT(place) as placecount
FROM table1
GROUP BY name, place
), orderplaces as (
SELECT name, place, ROW_NUMBER() OVER (PARTITION BY name ORDER BY placecount, place) as RN
FROM places
)
Select name, place
FROM orderplaces
WHERE RN = 1
Поскольку вы хотите обновить таблицу2 с помощью данных этого места, а не просматривать их, вы присоединитесь к таблице2 в последнем запросе и обновите что-то вроде этого
WITH places as (
SELECT name, place, COUNT(place) as placecount
FROM table1
GROUP BY name, place
), orderplaces as (
SELECT name, place, ROW_NUMBER() OVER (PARTITION BY name ORDER BY placecount, place) as RN
FROM places
)
UPDATE T2 set place = OP.place
FROM orderplaces OP
INNER JOIN table2 T2 on T2.name = OP.name
WHERE RN = 1;