我必须编写一个t-sql merge语句,我必须满足多个条件才能匹配。
表列名称: ID, 电子邮件地址, 名字, 姓, titile, 移动, DOB, 帐号, 地址, 邮政编码
这里的主要问题是,我正在使用的数据库没有必填字段,没有要比较的主键,源表也可以有重复记录。因此,有许多组合可以检查源表与目标表的重复项。我的经理提出了以下方案
我们可能有两个人使用相同电子邮件地址的数据,因此emailaddress,名字和姓氏匹配是100%匹配(认为其他所有其他列都是空的)
移动广告和帐户编号匹配的数据是100%匹配(认为所有其他列都是空的)
标题,姓氏,邮政编码,dob匹配是100%匹配(认为所有其他列都是空的)
我得到了这个任务,我无法看到数据,因为我是一名新员工,我的员工暂时不希望我看到这些数据。所以,我有点想象力。
解决方案现在,我正在考虑而不是根据目标数据库检查源的现有记录,我将使用存储过程语句清理源数据,如果它满足一个重复条件,那么它将跳过下一个重复删除语句和将数据插入目标表。
with cte_duplicate1 AS
(
select emailaddress, sname, ROW_NUMBER() over(partition by emailaddress, sname order by emailaddress) as dup1
from DuplicateRecordTable1
)
delete from cte_duplicate1
where dup1>1;
(如果执行了第一个cte_duplicate1代码,那么它将跳过cte_duplicate2)
with cte_duplicate2 AS
(
select emailaddress, fname, ROW_NUMBER() over(partition by emailaddress, fname order by emailaddress) as dup2
from DuplicateRecordTable1
)
delete from cte_duplicate2
where dup2>1;
这是目前模糊的计划。如果可以实现,我还不知道。
答案 0 :(得分:0)
我找到了一份我看不到数据的工作,因为我是新员工而我的员工不希望我给我数据。所以,我有点想象力。
无论如何,这里的主要问题是,我正在使用的数据库没有必填字段,没有要比较的主键,源表也可以有重复记录。因此,有许多组合可以检查源表与目标表的重复项。
解决方案 现在,我正在考虑而不是检查源数据库的现有记录,我将使用存储过程语句清理源数据,如果它满足一个重复条件,那么它将跳过下一个重复删除语句并将数据插入目标表
with cte_duplicate1 AS
(
select emailaddress, sname, ROW_NUMBER() over(partition by emailaddress, sname order by emailaddress) as dup1
from DuplicateRecordTable1
)
delete from cte_duplicate1
where dup1>1;
(如果执行了第一个cte_duplicate1代码,那么它将跳过cte_duplicate2)
with cte_duplicate2 AS
(
select emailaddress, fname, ROW_NUMBER() over(partition by emailaddress, fname order by emailaddress) as dup2
from DuplicateRecordTable1
)
delete from cte_duplicate2
where dup2>1;
这是目前模糊的计划。如果可以实现,我还不知道。