Sql server SQL Server:Insert语句复制非重复值
我已经多次遇到过这种情况,但在测试时,在同一个数据库上并不总是出现这种情况。我有两个独立的数据库,我正在合并成一个数据库,两个数据库的结构完全相同。当将记录从一个数据库插入到另一个数据库时,我看到不同的值在目标数据库上重复,但在一个源中只存在一次,而在目标数据库中不存在 例如: DB1..客户 DB2..客户 运行查询时: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
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;