私は性別に関連付けられた名前の辞書を作成しているので、メインテーブルに次のように言うことができます:
**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つのテーブルをこの条件でマージしたい
- anna を無視する (マージ条件 a.name=b.name で実行)
- キャメロンのエントリを無視します(これが私が立ち往生している場所です)
この結果を得るにはどうすればマージを作成できますか?
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 になります。