0

私は性別に関連付けられた名前の辞書を作成しているので、メインテーブルに次のように言うことができます:

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

「重複」、つまり、同じ名前で、次のように性別が異なるソースデータテーブル:

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

この2つのテーブルをこの条件でマージしたい

  1. anna を無視する (マージ条件 a.name=b.name で実行)
  2. キャメロンのエントリを無視します(これが私が立ち往生している場所です)

この結果を得るにはどうすればマージを作成できますか?

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)

それから私は言った、私たちの友人トーマス・チェルニッヒの提案に対してそれをテストしましょう。

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 になります。

4

1 に答える 1

1

マージよりも 2 つの個別の挿入を使用する方がおそらく簡単です。まず、次のように、テーブル a からすべてのエントリを挿入します。

insert into name_new select * from name_dict

次に、次のように、2 番目のテーブルの条件付き挿入を行います。

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 を整理し、2 番目のセクションでは両方の性別の重複を整理します。

于 2013-03-13T16:05:12.933 に答える