SQL Server:插入重复非重复值的语句

时间:2017-02-03 03:00:02

标签: sql-server database

我已经遇到过几次这种情况,但是在测试时它不会一直出现在同一个数据库中。我有两个独立的数据库,我合并到一个单独的数据库,两者结构完全相同。当从一个数据库向另一个数据库插入记录时,我看到目标数据库上存在重复的不同值,但是在一个源中只存在一次,而在目标中不存在。

示例:

DB1..Customer

Cust_ID | Last_Name | First_Name | Phone    | Email   | Field1
1       | Smith     | John       | 111-1111 | m@M.com |      

DB2..Customer

Cust_ID | Last_Name | First_Name | Phone    | Email   | Field1
1       | Jones     | Steve      | 222-2222 | S@S.com | 
2       | Smith     | Tom        | 333-3333 | S@m.com | 

当我运行查询时:

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 | m@M.com |      
2       | Jones     | Steve      | 222-2222 | S@S.com | 1
3       | Jones     | Steve      | 222-2222 | S@S.com | 1
4       | Jones     | Steve      | 222-2222 | S@S.com | 1
5       | Jones     | Steve      | 222-2222 | S@S.com | 1
6       | Smith     | Tom        | 333-3333 | S@m.com | 2
7       | Smith     | Tom        | 333-3333 | S@m.com | 2
8       | Smith     | Tom        | 333-3333 | S@m.com | 2

当我在field1列上运行一个具有多个db2..customer.cust_id计数的计数时,我注意到输入了重复值。由于Cust_ID是PK值,因此每个查询只应有一个值流入field1列。

有关为何可能发生这种情况的任何想法或建议?我的上一次查询重复了一些项目最多4次。在我看来,SQL在一个循环中被捕获,同时也将它们写入目标数据库。

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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)