在SQL Server中导入数据和忽略重复项

时间:2011-11-04 00:34:01

标签: sql sql-server-2008 tsql

我正在使用SQL Server 2008 R2。我有一个数据源表(I_Vendor),可能在CompanyName列上有重复项。我想将该数据导入新表(供应商),但新表具有名称列(对应于CompanyName),并且具有唯一约束。自从我完成SQL以来已经有一段时间了,但我看到了MERGE功能,看起来它符合要求。我写了以下内容:

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 个答案:

答案 0 :(得分:1)

您的MERGE语句将在I_Vendor表格中插入来自Vendor但没有匹配行的所有行。

例如,假设I_Vendor表中有两行,公司名称为“X”,并且进一步假设公司名称“X”未出现在Vendor表中,则两个行都将插入Vendor表中,违反约束条件。

要解决此问题,您需要确保MERGE语句的源数据中每个公司名称只有一行。以下合并声明是这样做的,但正如Aditya Naidu已经指出的那样,当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);