Actualizar columna para que sean diferentes valores agregados
Estoy creando un script para "fusionar" y eliminar filas duplicadas de una tabla. La tabla contiene información de dirección y utiliza un campo entero para almacenar información sobre el correo electrónico como marcas de bit (nombre de columna lngValue). Por ejemplo, lngValue & 1 == 1 significa que es la dirección principal.
Hay instancias en las que se ingresó el mismo correo electrónico dos veces, pero a veces con diferentes valores de lng. Para resolver esto, necesito tomar el lngValue de todos los duplicados y asignarlos a un registro superviviente y eliminar el resto.
Mi mayor dolor de cabeza en lo que respecta a la "fusión" de los registros. Lo que quiero hacer es bit a bit o todos los lngValues de registros duplicados juntos. Aquí está lo que tengo hasta ahora, que solo encuentra el valor de todos los valores de LngValues en modo bit o juntos.
Advertencia: código desordenado por delante
declare @duplicates table
(
lngInternetPK int,
lngContactFK int,
lngValue int
)
insert into @duplicates (lngInternetPK, lngContactFK, lngValue)
(
select tblminternet.lngInternetPK, tblminternet.lngContactFK, tblminternet.lngValue from tblminternet inner join
(select strAddress, lngcontactfk, count(*) as count from tblminternet where lngValue & 256 <> 256 group by strAddress, lngcontactfk) secondemail
On tblminternet.strAddress = secondemail.strAddress and
tblminternet.lngcontactfk = secondemail.lngcontactfk
where count > 1 and tblminternet.strAddress is not null and tblminternet.lngValue & 256 <> 256 --order by lngContactFK, strAddress
)
update @duplicates set lngValue = t.val
from
(select (sum(dupes.lngValue) & 65535) as val from
(select here.lngInternetPK, here.lngContactFK, here.lngValue from tblminternet here inner join
(select strAddress, lngcontactfk, count(*) as count from tblminternet where lngValue & 256 <> 256 group by strAddress, lngcontactfk) secondemail
On here.strAddress = secondemail.strAddress and
here.lngcontactfk = secondemail.lngcontactfk
where count > 1 and here.strAddress is not null and here.lngValue & 256 <> 256) dupes, tblminternet this
where this.lngContactFK = dupes.lngContactFK
) t
where lngInternetPK in (select lngInternetPK from @duplicates)
Editar:
Como se solicita aquí hay algunos datos de muestra:
Nombre de la tabla: tblminternet
Nombres de columna:
lngInternetPK
lngContactFK
lngValue
dirección
Ejemplo de fila 1:
lngInternetPK: 1
lngContactFK: 1
lngValor: 33
strAddress: "[email protected]"
Ejemplo fila 2:
lngInternetPK: 2
lngContactFK: 1
lngValor: 40
strAddress: "[email protected]"
Si estos dos se fusionaron aquí es el resultado deseado:
lngInternetPK: 1
lngContactFK: 1
lngValor: 41
strAddress: "[email protected]"
Otras reglas necesarias:
Cada contacto puede tener varios correos electrónicos, pero cada fila de correo electrónico debe ser distinta (cada correo electrónico solo puede aparecer como una fila).