合并多个匹配条件

时间:2015-10-01 11:16:40

标签: sql sql-server tsql

我必须编写一个t-sql merge语句,我必须满足多个条件才能匹配。

表列名称: ID, 电子邮件地址, 名字, 姓, titile, 移动, DOB, 帐号, 地址, 邮政编码

这里的主要问题是,我正在使用的数据库没有必填字段,没有要比较的主键,源表也可以有重复记录。因此,有许多组合可以检查源表与目标表的重复项。我的经理提出了以下方案

  1. 我们可能有两个人使用相同电子邮件地址的数据,因此emailaddress,名字和姓氏匹配是100%匹配(认为其他所有其他列都是空的)

  2. 移动广告和帐户编号匹配的数据是100%匹配(认为所有其他列都是空的)

  3. 标题,姓氏,邮政编码,dob匹配是100%匹配(认为所有其他列都是空的)

  4. 我得到了这个任务,我无法看到数据,因为我是一名新员工,我的员工暂时不希望我看到这些数据。所以,我有点想象力。

    解决方案现在,我正在考虑而不是根据目标数据库检查源的现有记录,我将使用存储过程语句清理源数据,如果它满足一个重复条件,那么它将跳过下一个重复删除语句和将数据插入目标表。

    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;
    

    这是目前模糊的计划。如果可以实现,我还不知道。

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;

这是目前模糊的计划。如果可以实现,我还不知道。