Sql server SQL Server:Insert语句复制非重复值

Sql server SQL Server:Insert语句复制非重复值,sql-server,database,Sql Server,Database,我已经多次遇到过这种情况,但在测试时,在同一个数据库上并不总是出现这种情况。我有两个独立的数据库,我正在合并成一个数据库,两个数据库的结构完全相同。当将记录从一个数据库插入到另一个数据库时,我看到不同的值在目标数据库上重复,但在一个源中只存在一次,而在目标数据库中不存在 例如: DB1..客户 DB2..客户 运行查询时: INSERT INTO DB1..Customer (Last_Name, First_Name, Phone, Email, Field1) SELECT

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

例如:

DB1..客户

DB2..客户

运行查询时:

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..客户

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


关于为什么会发生这种情况,有什么想法或建议吗?我上次运行的查询将某些项复制了4次。在我看来,SQL在搜索患者的同时还将其写入目标数据库,这似乎陷入了一个循环

能否尝试将外部查询和子查询中使用的别名更改为不同的别名?我手头没有多个实例要测试,但我想知道它是否被解释为一个相关的子查询

尝试以下查询,该查询使用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) 

能否尝试将外部查询和子查询中使用的别名更改为不同的别名?我手头没有多个实例要测试,但我想知道它是否被解释为一个相关的子查询

尝试以下查询,该查询使用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) 

左键连接稍微慢一点,但更容易阅读,并且做您想要的事情

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;

左键连接稍微慢一点,但更容易阅读,并且做您想要的事情

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;

SQL Server没有陷入循环。SQL Server没有陷入循环。我没有作为第二种方法存在于其中,并解释说它会执行得更好。然而,我们不得不假设他从第一天起就滥用了field1,它有一个唯一的索引,并且是相同的数据类型。如果我们必须引用主查询的字段Last_Name、First_Name、Email、Phone来创建一个WHERE NOT EXISTS并从中选择1,那么NOT EXISTS的性能将不会更好。。。其中Last_Name=A.Last_Name…它在您提供的链接示例中起作用,因为这些是PKs。我没有作为第二种方法存在于其中,并解释说它会执行得更好。然而,我们不得不假设他从第一天起就滥用了field1,它有一个唯一的索引,并且是相同的数据类型。如果我们必须引用主查询的字段Last_Name、First_Name、Email、Phone来创建一个WHERE NOT EXISTS并从中选择1,那么NOT EXISTS的性能将不会更好。。。其中Last_Name=A.Last_Name…它在您提供的链接中的示例中起作用,因为这些是PKs。
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;