我已经遇到过几次这种情况,但是在测试时它不会一直出现在同一个数据库中。我有两个独立的数据库,我合并到一个单独的数据库,两者结构完全相同。当从一个数据库向另一个数据库插入记录时,我看到目标数据库上存在重复的不同值,但是在一个源中只存在一次,而在目标中不存在。
示例:
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在一个循环中被捕获,同时也将它们写入目标数据库。
答案 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)