Вы смотрите на два шага операция. Либо вставьте объединенные данные в новую таблицу, затем отбросьте исходную таблицу или обновите одну строку с объединенными данными и удалите все лишние строки. На первый взгляд, первый метод кажется самым легким на сегодняшний день.
insert into NewTable(ID, LastName, FirstName, Address, Email, ...
select Min(ID), LastName, FirstName, Min(Address), Min(Email), ...
from OldTable
group by LastName, FirstName;
drop OldTable;
exec sp_rename 'NewTable', 'OldTable'; -- Optional
Но у вас могут не быть привилегии перебрасывать и переименовывать таблицы. Кроме того, вы должны убедиться, что вы дублируете любые триггеры, индексы, ограничения и т. Д.
Последний метод немного сложнее, чем DML-мудрый, но более безопасный.
with
New as(
select Min(ID) MinID, LastName, FirstName,
Min(Address) MinAddr, Min(Email) MinEmail,
Min(Tel) MinTel, Min(Mobile) MinMobil, Min(Age) MinAge
from OldTable
group by LastName, FirstName
)
update Old
set Old.Address = New.MinAddr,
Old.Email = New.MinEmail,
Old.Tel = New.MinTel,
Old.Mobile = New.MinMobil,
Old.Age = New.MinAge
from OldTable Old
join New
on New.MinID = Old.ID;
select * from OldTable;
with
MinIDs as(
select Min(ID) MinID, LastName, FirstName
from OldTable
group by LastName, FirstName
)
delete from Old
from OldTable Old
join MinIDs MI
on MI.MinID < Old.ID;
И это на самом деле не имеет значения, если вы используете Min
или Max
с неключевых полей. Вот Fiddle для последнего метода.
Как вы решаете, какие записи должны быть объединены? –
вы должны прояснить все разные сценарии. Как и если есть два адреса для одного и того же человека или двух мобильных и т. Д. BTW Deepshikha запрос хорош. – KumarHarsh
Привет. Спасибо за ваш ответ. Если две записи имеют два разных адреса, я не хочу объединять эту запись. – skysurfer