2011-11-04 96 views
0

我正在使用SQL Server 2008 R2。我有一个可能在CompanyName列上有重复项的数据源表(I_Vendor)。我想将这些数据导入到一个新表(Vendor)中,但是新表有一个Name列(对应于CompanyName),并且具有唯一的约束条件。自从我完成SQL之后,我已经有一段时间了,但我看到了MERGE函数,看起来它符合法案。我写道:导入数据并忽略SQL Server中的重复项

MERGE Vendor AS T 
USING I_Vendor AS S 
ON (T.Name = S.CompanyName) 
WHEN NOT MATCHED BY TARGET 
    THEN INSERT(VendorId, Name, ContactName, ContactInfoId) 
     VALUES(S.Vendor_ID, S.CompanyName, S.ContactName, S.Vendor_ID+10000); 

它会产生一个“的UNIQUE KEY约束冲突”,并给出了Vendor.Name唯一约束的名称。有人知道我做错了什么?

+1

如果源表中有两行具有相同的companyName和不同的联系人名称,您需要在Vendor表中使用哪个联系人姓名?类似的其他专栏呢? –

+0

抱歉不清楚。联系人名称并不重要,我只需要获取所有供应商名称的清单(另外我想弄清楚如何使用合并命令)。 – Tod

回答

1

MERGE语句将插入I_Vendor所有行没有在Vendor表中的匹配行。

例如,假设有在I_Vendor表公司名称“X”两行,并进一步假设公司名称为“X”并没有出现在Vendor表,然后行会被插入到Vendor表违反了约束。

要解决该问题,需要确保MERGE语句的源数据中每个公司名称只有一行。下面的合并语句做到这一点,但阿迪亚杜女士已经指出的那样,我们不知道你想做什么时,与同一家公司的名称有多个记录在I_Vendor表:

MERGE Vendor AS T 
USING (SELECT MAX(Vendor_ID), CompanyName, MAX(ContactName), MAX(ContactInfoId) 
     FROM I_Vendor 
     GROUP BY CompanyName) AS S 
WHEN NOT MATCHED BY TARGET 
    THEN INSERT(VendorId, Name, ContactName, ContactInfoId) 
     VALUES(S.Vendor_ID, S.CompanyName, S.ContactName, S.Vendor_ID+10000); 
+0

感谢您对MERGE命令的解释和工作示例。我一直在想,第一个x联系人姓名出现在第二个x不匹配。我已经离开了SQL太久,忘记了如何以面向集合的方式进行思考。 – Tod