「既存のレコードには、指定された 4 つのフィールド、つまり 2 つ以上の有効なトランザクションのアカウント、日付、金額、詳細の同じ値に基づいて重複レコードがある場合がありますが、これらのレコードは重複値があっても有効です。」
しかし、ロードされたデータまたはソース ファイルに一意性のトークンがない場合、どうすればわかりますか? 有効性とはどういう意味ですか?
「失われたレコードをロードするために、すでにロードされているレコードをロードしないように、レコードがすでにロードされているかどうかを識別する必要があります。」
一意性の既存のソースがなければ、これを行うことはできません。の特定の組み合わせに対して 2 つの行が(Account, Date, Amount, Particulars)
あり、それで問題ないため、(Account、Date、Amount、Particulars) の 3 番目のインスタンスが既に読み込まれているレコードであると判断するためのルールは何ですか?これはロードされていないため、有効です。
「ですから、私には、これらのフィールドに基づいてレコードがすでに読み込まれているかどうかを知るのは非常に難しいように見えます。これらのフィールドの制限を超えていると思います。」
あなたが説明したように、データには解決策が見つからないと言っても過言ではありません。しかし、解決策は実際には非常に簡単です。ロードされたレコードの有効性を主張した人々のところに行き、これらの追加レコードのリストを提示します。彼らはスキルと判断力を駆使して、どのレコードが有効かを教えてくれるので、あなたはそれらをロードします。
「解決策を見つけるのが私の義務です」
いいえ、それはあなたの義務ではありません。現在、データ セットを正確に定義する義務はデータ所有者の肩にかかっており、これにはビジネス キーの特定が含まれます。彼らは責任を放棄している人です。
このような状況では、次の 3 つの選択肢があります。
- データ所有者が義務を果たすまで、それ以上のレコードの読み込みを拒否します。
- ロードのために提示されたすべてのレコードを、検証なしでロードします。
- ひどい NOVALIDATE 構文を使用してください。
NOVALIDATE は、将来の行に検証規則を適用する方法ですが、既存のデータの違反は無視します。基本的に、これは政治的な問題に対する技術的なクラッジです。
SQL> select * from t23
/
COL1 COL2
---------- --------------------
1 MR KNOX
1 MR KNOX
2 FOX IN SOCKS
2 FOX IN SOCKS
SQL> create index t23_idx on t23(col1,col2)
/
Index created.
SQL> alter table t23 add constraint t23_uk
unique (col1,col2) novalidate
/
Table altered.
SQL> insert into t23 values (2, 'FOX IN SOCKS')
/
insert into t23 values (2, 'FOX IN SOCKS')
*
ERROR at line 1:
ORA-00001: unique constraint (APC.T23_UK) violated
SQL>
制約を追加する前に、一意でないインデックスを事前に作成する必要があることに注意してください。そうしないと、データベースは一意のインデックスを作成し、NOVALIDATE 句をオーバーライドします。
私は NOVALIDATE を恐ろしいと表現しています。データの破損をデータベースに焼き付けます。しかし、それは解決に最も近いものです。
このアプローチは、「有効性」の概念を完全に無視しています。そのため、「有効な」 n 番目の (Account, Date, Amount, Particulars)
. これは避けられません。良いニュースは、有効性を確立するための定義された規則がないため、だれにもわからないということです。
どのオプションを選択する場合でも、上司、データ所有者、データ所有者の上司、および適切と思われるその他の人物に明確に説明し、先に進むための書面による同意を得ることが重要です。そうしないと、いずれデータベースが重複した行でいっぱいになっていることに人々が気付くか、誰かが「有効な」レコードがロードされていないと文句を言うでしょう。適切なトップブラスからの許可を得て紙。
幸運を
MERGE を使用するという Haki の提案は、NOVALIDATE と同じ効果があります。これは、新しいレコードが読み込まれ、すべての重複が抑制されるためです。ただし、これはさらにお粗末です。一意性の概念についてはまったく触れていません。INSERT または UPDATE アクセス権を持っていた人は、好きな行を持つことができます。したがって、このアプローチは、そのテーブルに対する権限を完全にロックダウンして、そのデータを MERGE を介してのみ操作でき、他の DML を操作できない場合にのみ機能します。継続的な一意性が重要かどうかによって異なります。繰り返しますが、ビジネス上の決定です。