Oracle 合并2个表,忽略重复项

Oracle 合并2个表,忽略重复项,oracle,merge,duplicates,Oracle,Merge,Duplicates,我正在制作一本与性别相关的名字词典,所以我有一个主表,让我们说: **name_dict a** name gender ======================= jhon male jane female anna female 还有一个源数据表,它有“副本”,我的意思是,相同的名称,不同的性别如下: **name_source b** name gender ======================= cameron male cameron f

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

**name_dict a**
name   gender
=======================
jhon   male
jane   female
anna   female
还有一个源数据表,它有“副本”,我的意思是,相同的名称,不同的性别如下:

**name_source b**
name      gender
=======================
cameron   male
cameron   female
anna      female
travis    male
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)
        )
我想用这个条件合并这两个表

  • 忽略anna(在合并条件a.name=b.name中完成)
  • 忽略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

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

    **name_source b**
    name      gender
    =======================
    cameron   male
    cameron   female
    anna      female
    travis    male
    
    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)
            )
    
    然后,对第二个表执行条件插入,如下所示:

    **name_source b**
    name      gender
    =======================
    cameron   male
    cameron   female
    anna      female
    travis    male
    
    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案例,第二个部分将整理男女重复的案例。

    你能展示你当前的
    merge
    语句吗,这样人们就可以在它的基础上进行构建?我还没有完成,我不知道如何为相同姓名不同性别的情况添加条件,但现在我有了主意,我会在大约15分钟后发布,一旦我测试了它,得到了灵感!!谢谢你的帮助,我将试一试并分享我的发现!!