【问题标题】:Merging 2 tables ignoring duplicates合并2个表忽略重复
【发布时间】:2013-03-01 16:09:28
【问题描述】:

我正在制作一个与性别相关的名字字典,所以我有一个主表可以说:

**name_dict a**
name   gender
=======================
jhon   male
jane   female
anna   female

还有一个源数据表,它有“重复”,我的意思是,同名,不同性别,如下所示:

**name_source b**
name      gender
=======================
cameron   male
cameron   female
anna      female
travis    male

我想用这个条件合并这两个表

  1. 忽略 anna(在合并条件 a.name=b.name 中完成)
  2. 忽略cameron条目(这是我卡住的地方)

我将如何创建我的合并以获得这个结果?

name      gender
----------------
jhon      male
jane      female
anna      female
travis    male

非常感谢您的所有帮助和建议!

编辑---------------------------------------------- -------------------------- 所以,这是我用我的灵感创造的

merge into name_dictionary x using(
    select a.name,a.gender from name_source a, (select name,count(1) from name_source group by name having count(1)>1 order by count(1)) b
    where a.name=b.name
    ) y
    on (x.name=y.name)
    when not matched then
    insert (name,gender)
    values (y.name,y.gender)

然后我说,让我们根据我们的朋友 Thomas Tschernich 的建议对其进行测试,因为我使用了:

insert into name_dictionary
    select name,gender
    from name_source t1
    where
        (t1.name, t1.gender) not in (
            select name, gender from name_dictionary
        )
        and
        (t1.name, t1.gender) not in (
            select t2.name, t2.gender
            from name_source t2
            join name_source t3 on (t2.name = t3.name and t2.gender != t3.gender)
        );

然后两个人互相攻击并得到:

QUERY      EXEC TIME    FINAL ROWS  PLAN DATA
merge      2 secs        96,070         MERGE STATEMENT ALL_ROWS Cost: 253 Bytes: 46,752 Cardinality: 974 
c-Insert    killed (31m)          ¿?            INSERT STATEMENT ALL_ROWS Cost: 24,656,135 Bytes: 1,051,700 Cardinality: 105,170 

这是我使用的表格的信息:

Table          Initial Rows            Observations 
name_dictionary 3,097           The ones already inserted   
name_source     101,205         The ones i  want to filter and add to the name_dictionary

(无法正确格式化,希望它可读) 无论如何,我希望你能详细说明它是否正确或我错过了什么,非常感谢!!!

---新发现 如果我在合并中删除订单,成本会上升到 298;

【问题讨论】:

  • 您能否展示您当前的merge 声明,以便人们可以在此基础上进行构建?
  • 我还没写完,我不知道如何为同名不同性别的情况添加条件,但现在我有了想法,我会在测试后大约 15 分钟后发布,受到启发!

标签: oracle merge duplicates


【解决方案1】:

使用两个单独的插入可能比合并更容易。 首先,插入表 a 中的所有条目,如下所示:

insert into name_new select * from name_dict

然后,为您的第二个表执行条件插入,如下所示:

insert into name_new
    select *
    from name_source t1
    where
        (t1.name, t1.gender) not in (
            select name, gender from name_new
        )
        and
        (t1.name, t1.gender) not in (
            select t2.name, t2.gender
            from name_source t2
            join name_source t3 on (t2.name = t3.name and t2.gender != t3.gender)
        )

第一个where 部分会整理出 anna-case,第二个部分会整理出两个性别的重复项。

【讨论】:

  • 感谢您的帮助,我会试一试并分享我的发现!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多