我正在使用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上给出唯一约束的名称。谁知道我做错了什么?
答案 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);