2

メール アドレスが重複しているテーブルがあります。そのうちの 1 つだけを、他の 2 つのフィールドと共に一時テーブルに挿入する必要があります。ここには多くの例がありますが、どれでも動作させることができます。

MERGE を調べたところ、同じ結果が得られました。すべてのレコードが挿入されています。私は迷っています。さまざまなサンプルを試しましたが、常にすべてのレコードが挿入されます。メールアドレスが本当にだまされていることを確認するために戻ってきました..以下は私が今いるところです..

MERGE #EmailTable2 AS Target
USING (SELECT EMAIL, NAME, JOB_TITLE FROM b2b_cmas_list$ WHERE EMAIL IS NOT NULL) AS Source
ON (Target.EMAIL = Source.EMAIL)
 WHEN NOT MATCHED BY TARGET THEN
    INSERT (EMAIL, NAME, JOB_TITLE)
    VALUES (Source.EMAIL, Source.NAME, Source.JOB_TITLE)

OUTPUT $action, inserted.*, deleted.*;

したがって、これを正しくするための助けがあれば役立ちます。

4

1 に答える 1

1

SQL は、同じ電子メールを含む 2 つの行のどちらを選択するかを認識していないため、これは機能しません。つまり、EMAIL が同じ場合、どちらのペア (NAME と JOB_TITLE) が重要で、どちらを破棄できるでしょうか?

いくつかのヒント:

  1. どの項目を選択しても問題ない場合は、単純に EMAIL で MAX(NAME) と MAX(JOB_TITLE) を選択してグループ化します。

    b2b_cmas_list$ グループから EMAIL, max(NAME), max(JOB_TITLE) を EMAIL で選択

    ただし、これは NAME-JOB_TITLE ペアを台無しにする可能性があることに注意してください (最大が選択されているため)。

  2. ROW_NUMBER() OVER() を使用して、各グループの最初の行を任意に選択してみてください。

  3. CURSOR を使用して行を反復処理し、重複をスキップします。

  4. .NET CLR 集約を使用して、同じ電子メールの名前と役職を連結します。

そして、MERGEステートメントに少し注意してください。SQL は行ごとではなくすべての行を一度にチェックするため、これは期待どおりに機能しません。だからといって、メールひとつでいいわけではありません。すなわち。「a@a.com」が挿入された後、別のものは挿入されません。「a@a.com」がステートメントの先頭の表にあるかどうかだけが重要です。

于 2012-06-28T19:41:34.123 に答える