2014-01-19 8 views
10

"OPENQUERY"を使用してMS SQL ServerからMySQLデータベースにレコードを挿入しようとしていますが、重複するキーメッセージを無視することを試みています。クエリが重複して実行されると、それを無視して続行します。MS SQL Serverの「INSERT IGNORE」とは何ですか?

重複を無視するためにどのようなアイデアがありますか? 「A.record_id」は、特定の基準にMS SQL Serverの」内のレコードにそれらのレコードを結合

    1. をMySQLを定義するには、「OPENQUERYを」使用してMySQLからレコードを引っ張っ:ここ

      は私がやっているものですここからIDを直接入力するのではなく、SQL Serverに関連する新しい "B.new_id"レコード識別子があります。

    2. A.record_id、B.new_idのように、見つかった結果をMySQLの新しいテーブルに挿入したいのですが、ここで新しいテーブルにA.record_idがそのテーブルの主キーとして設定されています。

    テーブルAをテーブルBに何度か結合すると、私が探している基準に一致する2つのレコードがテーブルBに見つかり、A.record_idの値が2+倍になりますそれを問題の原因となるテーブルAに挿入してください。注意集計関数を使用してレコードを削除することができます。

  • +0

    @MartinSmith。私はIGNORE_DUP_KEYを使用しようとしましたが、構文エラーが発生します。私はopenqueryで使用できるかどうかわかりません。ここに私の使用例INSERT IGNORE_DUP_KEY OPENQUERY – Jaylen

    +0

    'IGNORE_DUP_KEY'はインデックスのプロパティです。クエリで使用するキーワードではありません。 SQL Serverに挿入する場合を除き、転送の方向を明確にする必要はありません。そのメモに感謝します。 –

    答えて

    8

    特定のオプションはありません。しかし、行うのに十分に簡単です:

    insert into oldtable(. . .) 
        select . . . 
        from newtable 
        where not exists (select 1 from oldtable where oldtable.id = newtable.id) 
    

    ユニークキーの複数のセットがある場合は、追加のnot exists文を追加することができます。

    EDIT:改訂された問題について

    insert into oldtable(. . .) 
        select . . . 
        from (select nt.*, row_number() over (partition by id order by (select null)) as seqnum 
          from newtable nt 
         ) nt 
        where seqnum = 1 and 
          not exists (select 1 from oldtable where oldtable.id = nt.id); 
    

    row_number()関数は、行のグループ内の各行に連続番号を割り当てます。グループはpartition byステートメントで定義されています。数字は1から始まり、そこから増加します。 order by句は、あなたが注文を気にしないと言います。それぞれのIDが1つの行の値は1になります。重複する行の値は1より大きくなります。 seqnum = 1はidごとに1行だけを選択します。

    +0

    問題は、私の選択で重複を生成している可能性があり、元のレコードが存在しないために2つの異なる時刻を挿入しようとするとエラーが発生するため、エラーが発生します。 – Jaylen

    +0

    2番目のクエリを説明していただけますか?私は決して(パーティションは.....それは何か、それが何であるのか分からない。私はそれを私のクエリにどのように適用できるのか知る必要があります。 – Jaylen

    +0

    これは今でも私のために働いています。私は私の質問に私が走っている問題を説明するために再度述べました。それを確認してください。私はあなたの答えは正しい軌道にあると思う – Jaylen

    7

    SQL Server 2008以降では、MERGEを使用して、行が存在しない場合はINSERT、またはUPDATEを入力できます。

    例:私は混乱の部分は私の質問を形成取り除か

    MERGE 
    INTO dataValue dv 
    USING tmp_holding_DataValue t 
    ON  t.dateStamp = dv.dateStamp 
         AND t.itemId = dv.itemId 
    WHEN NOT MATCHED THEN 
    INSERT (dateStamp, itemId, value) 
    VALUES (dateStamp, itemId, value) 
    
    +1

    彼はOPENQUERYでMS SqlからレコードをMySqlに挿入しようとしているようです。この場合、マージはまったく役に立たないと私は考えていません。 –

    +2

    質問とタイトルは混乱し、反対です。 @MikeがSQL ServerのMySQLに相当する 'INGORE INSERT'を要求するタイトルを調べました。質問が反対である、つまりSQL ServerからMySQLに挿入されているのに対して、 –

    関連する問題