Вы можете прекратить использовать select *, вы дважды возвращаете идентификатор объекта, что приводит к расточительству как сервера, так и сетевых ресурсов. И действительно ли вам нужны все остальные поля? Устраните все, что вам не нужно. Выбор * не должен использоваться в производственном коде в любом случае.
У вас есть коррелированный подзапрос, который запускает строку путем агонизации строки, попробуйте вместо этого использовать соединения:
SELECT e.*, addr.*
FROM [Entity] e
LEFT JOIN (SELECT addr.*
FROM [Address] a
JOIN
(SELECT Top 1 a.[AddressID]
FROM [Address] AS a
WHERE a.Code = 'MAILING'
AND a.[EntityID] = e.[EntityID]
ORDER BY a.[PrimaryAddress] DESC) dedup
ON a.address_id = dedup.address_id) addr
ON addr.[EntityID] = e.[EntityID]
И снова не используйте select *, я не знаю ваших полей, или я бы указал их выше.
Конечно, реальный способ исправить это - исправить плохо спроектированную базу данных. Он не должен разрешать более одного основного адреса (мы применяем это через триггер), тогда вам не понадобится дорогая задача удаления дубликатов. Я понимаю, что в вашем случае это невозможно, но это может заставить кого-то задуматься над их недостатком дизайна. Поскольку это сторонний продукт, я бы попросил его исправить его, чтобы разрешить только один основной адрес. В конце концов, если жалуются достаточное количество людей, они могут.