2017-02-03 12 views
0

このシナリオを数回実行しましたが、テスト中に同じデータベースで常時発生することはありません。私は2つの別々のデータベースを持っています。私は1つのdbにマージしています。あるデータベースから別のデータベースにレコードを挿入すると、ターゲットデータベースに重複した値が重複して表示されていますが、1つのソースにはターゲットが1つしか存在しません。SQL Server:重複しない値を複製する文を挿入します

例:

DB1..Customer

Cust_ID | Last_Name | First_Name | Phone | Email | Field1 
1  | Smith  | John  | 111-1111 | [email protected] |  

DB2..Customer

Cust_ID | Last_Name | First_Name | Phone | Email | Field1 
1  | Jones  | Steve  | 222-2222 | [email protected] | 
2  | Smith  | Tom  | 333-3333 | [email protected] | 

私は私のクエリを実行します。

INSERT INTO DB1..Customer (Last_Name, First_Name, Phone, Email, Field1) 
    SELECT 
     Last_name, First_Name, Phone, Email, Cust_ID 
    FROM 
     DB2..Customer DB2 
    WHERE 
     DB2.Cust_ID NOT IN (SELECT DB2.Cust_ID 
          FROM DB2..Customer DB2 
          INNER JOIN DB1..Customer DB1 ON DB1.Last_Name = DB2.Last_Name 
                 AND DB1.First_Name = DB2.First_Name 
                 AND DB1.Email = DB2.Email) 

結果:

DB1..Customerは

Cust_ID | Last_Name | First_Name | Phone | Email | Field1 
1  | Smith  | John  | 111-1111 | [email protected] |  
2  | Jones  | Steve  | 222-2222 | [email protected] | 1 
3  | Jones  | Steve  | 222-2222 | [email protected] | 1 
4  | Jones  | Steve  | 222-2222 | [email protected] | 1 
5  | Jones  | Steve  | 222-2222 | [email protected] | 1 
6  | Smith  | Tom  | 333-3333 | [email protected] | 2 
7  | Smith  | Tom  | 333-3333 | [email protected] | 2 
8  | Smith  | Tom  | 333-3333 | [email protected] | 2 

私はdb2..customer.cust_idの複数のカウントを持つfield1列の数を実行したときに重複した値が入力された気づきます。 Cust_IDはPKの値なので、クエリごとに1つの値フローをfield1カラムに入れるだけです。

これがなぜ発生するのかに関するご意見やご提案はありますか?私の最後のクエリは、最大4回のアイテムを複製しました。それは私にはSQLが患者のためにループを掘り起こしている間に捕捉されていると同時に、同時にそれらをターゲットのDBに書き込んでいるようです。

+0

SQL Serverはループに巻き込まれません。 – SQLMason

答えて

0

外部クエリとサブクエリで使用するエイリアスを異なるように変更してみることはできますか?私は手元に複数のインスタンスをテストする必要はありませんが、相関サブクエリとして解釈されているのだろうかと思います。

エイリアスを区別するためにDB1_Inner/DB2_Inner/DB2_Outerを使用して次のクエリ、試してみてください。

Insert into DB1..Customer (Last_Name, First_Name, Phone, Email, Field1) 
SELECT Last_name, First_Name, Phone, Email, Cust_ID 
from DB2..Customer DB2_Outer 
Where DB2_Outer.Cust_ID not in 
    (Select DB2_Inner.Cust_ID 
    from DB2..Customer DB2_Inner 
    Inner Join DB1..Customer DB1_Inner 
    on DB1_Inner.Last_Name=DB2_Inner.Last_Name 
     and DB1_Inner.First_Name=DB2_Inner.First_Name 
     and DB1_Inner.Email=DB2_Inner.Email) 
3

左接合は少し遅くなりますが、読みやすい、あなたが欲しいものを行います。

INSERT INTO DB1..Customer(
    Last_Name 
, First_Name 
, Phone 
, Email 
, Field1) 
SELECT 
    B.Last_name 
, B.First_Name 
, B.Phone 
, B.Email 
, B.Cust_ID 
FROM 
    DB2..Customer B 
    LEFT JOIN 
    DB1..Customer A ON 
    A.Last_Name = B.Last_Name 
    AND 
    A.First_Name = B.First_Name 
    AND 
    A.Email = B.Email 
    AND 
    A.Phone = B.Phone 
WHERE A.Cust_ID IS NULL; 
+0

http://dba.stackexchange.com/questions/121034/best-practice-between-using-left-join-or-not-exists – rafaelbattesti

+0

私はそこに2番目の方法として存在しておらず、より良い結果が得られると説明しました。しかし、私たちは1日目からフィールド1を虐待したと仮定しなければならないでしょう。ユニークなインデックスがあり、同じデータタイプでした。 WHERE NOT EXISTS(SELECT 1 FROM ... WHERE Last_Name = A)を作るためにメインクエリのフィールド( 'Last_Name'、 'First_Name'、' Email'、 'Phone')を参照しなければならない場合、 .Last_Name ... ' – SQLMason

+0

これはPKであるため、あなたが提供したリンクの例で動作します。 – SQLMason

関連する問題