以下に示すように、2つのテーブルがあります。
トランザクション テーブルは、バイヤーとサプライヤー間の販売イベントを表すテーブルです。表の ... は、TransactionDate、ストア情報などの他の列を表します。
連絡先テーブルは、名前や自宅の住所など、バイヤーとサプライヤーの情報を表すテーブルです。
現在、2 つのテーブルは、BuyerID = ContactID および SellerID = ContactID という 1 対 1 の関係を共有しています。
このテーブルに Python スクリプトを入力しているので、答えは Python、SQL、またはその両方である可能性があります。
現在の状態
取引表
トランザクション ID (pk) | ... | バイヤーID | 販売者ID |
---|---|---|---|
11914 | 11914 バイヤー | 11914 売り手 | |
11915 | 11915 バイヤー | 11915 売り手 | |
11916 | 11916 バイヤー | 11916 売り手 |
連絡表
連絡先 ID (pk) | ... | ファーストネーム | 苗字 |
---|---|---|---|
11914 バイヤー | マイク | ドウ | |
11914 売り手 | ジャネット | マイヤーズ | |
11915 バイヤー | ジャネット | マイヤーズ | |
11915 売り手 | マイク | ドウ | |
11916 バイヤー | デイブ | ダーク | |
11916 売り手 | ジャネット | マイヤーズ |
私がしたいのは、連絡先テーブルの繰り返し行を削除し、テーブルの関係を 1 対多にすることです。さらに、たとえば Janet Myers が姓を変更した場合、他のすべての列が同じままであっても、Contact テーブルに新たに追加されます。つまり、ContactID 列を無視すると、ContactTable に 2 つの同一の行があってはなりません。
将来の状態
取引表
トランザクション ID (pk) | ... | バイヤーID | 販売者ID |
---|---|---|---|
11914 | 06dfe636-4408-4abe-b902-b1ac6aab9849 | 58e5c2f7-d0ef-4129-a5a8-e17efaee0a1d | |
11915 | 58e5c2f7-d0ef-4129-a5a8-e17efaee0a1d | 06dfe636-4408-4abe-b902-b1ac6aab9849 | |
11916 | ab99de1f-a714-4709-9a1e-f3a143b279d2 | 58e5c2f7-d0ef-4129-a5a8-e17efaee0a1d |
連絡表
連絡先 ID (pk) | ... | ファーストネーム | 苗字 |
---|---|---|---|
06dfe636-4408-4abe-b902-b1ac6aab9849 | マイク | ドウ | |
58e5c2f7-d0ef-4129-a5a8-e17efaee0a1d | ジャネット | マイヤーズ | |
ab99de1f-a714-4709-9a1e-f3a143b279d2 | デイブ | ダーク |
これを解決するために最初に考えたのは、他のすべての列のハッシュから ContactID を作成することです。
sha256(json.dumps(contactDict.encrypt('utf-8'))).hexdigest()
次にMERGE
、ContactID ハッシュがまだテーブルに存在しない場合は、ステートメントを使用して連絡先を追加します。これはうまくいくと思いますが、財務データとのハッシュ衝突の危険を冒すことを考え直しています。
ハッシュ以外に、私の他の考えはMERGE
ステートメントですが、ON
句に約 15 の列があるため、パフォーマンスが非常に低いと思いました。