2011-11-04 62 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