【问题标题】:Merge with multiple matching conditions与多个匹配条件合并
【发布时间】:2015-10-01 11:16:40
【问题描述】:

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

表列名: ID, 电子邮件地址, 名, 姓, 标题, 移动的, 出生日期, 帐号, 地址, 邮政编码

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

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

  2. 手机和帐号匹配为 100% 的数据(认为其他所有列均为空)

  3. title、surname、postcode、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;

这是目前的模糊计划。不知道能不能实现。

【问题讨论】:

  • 请编辑您的查询并提供示例数据和所需的结果。
  • 当然是。你至少应该先尝试一些东西,如果它不起作用,你把它贴在这里,我们会提供帮助。虽然两个人有相同的电子邮件????到目前为止,似乎很奇怪
  • 这个问题根本不是关于合并的。您在问“我怎样才能编写一个连接条件,以便只有一个条件必须匹配”。
  • 谢谢大家。我被告知要编写满足不同匹配条件的合并查询。现在,我将采取不同的方式。我将在数据质量服务中创建规则并检查重复项,清理数据然后合并到目标表中。
  • @MasudAhmed 那么请写下你自己的答案,解释你做了什么,并接受它。这样一来,寻找未解决问题的人(比如我)就不会浪费时间阅读这个问题已经在某个地方的 cmets 中解决了。

标签: sql sql-server tsql


【解决方案1】:

我提供了一份看不到数据的工作,因为我是新员工,而我的员工不想让我给我工作的数据。所以,我有点用我的想象力工作。

无论如何,这里的主要问题是,我正在使用的数据库没有必填字段,没有要比较的主键,源表也可以有重复记录。结果,有许多组合可以检查源表与目标表的重复项。

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

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;

这是目前的模糊计划。我还不知道它是否可以实现。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-12-28
    • 1970-01-01
    • 2014-09-11
    • 2016-11-29
    • 1970-01-01
    • 2021-01-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多