避免插入重复记录?

时间:2014-01-02 14:53:18

标签: sql sql-server sql-server-2012

我有一个应用程序,其中有一个名为Products的表。我的后台服务是从excel文件插入数据。问题是有时excel文件包含一些重复数据。我的示例声明是,

INSERT INTO Products
SELECT Name, Phone, SKU, ModelNumber FROM BlahBlah

问题是我想确保SKU和ModelNumber应该是唯一的。意味着它可以为null。但如果价值在那里,那么组合应始终是唯一的。因此,如果SKU和ModelNumber有多个值,那么我应该只插入第一个。

2 个答案:

答案 0 :(得分:4)

考虑到你可能有多个excel文件并且已经在你的表中有数据并且还在查看空值,试试这个:

INSERT INTO Products
SELECT Name, Phone, SKU, ModelNumber FROM BlahBlah
 where not exists (select * from Products 
                    where coalesce(Products.SKU,'{NULL}') = coalesce(BlahBlah.SKU,'{NULL}')
                      and coalesce(Products.ModelNumber,-1) = coalesce(BlahBlah.ModelNumber, -1)

我假设SKU是text和ModelNumber数字。如果要更新Products表,而不是仅在已存在时插入值,请尝试合并:

MERGE 
 INTO Products 
USING BlahBlah
   ON coalesce(Products.SKU,'{NULL}') = coalesce(BlahBlah.SKU,'{NULL}')
  and coalesce(Products.ModelNumber,-1) = coalesce(BlahBlah.ModelNumber, -1)
 WHEN MATCHED 
 THEN update set Products.Name = BlahBlah.Name, Products.Phone = BlahBlah.Phone
 WHEN NOT MATCHED 
 THEN insert (Name, Phone, SKU, ModelNumber)
      values (BlahBlah.Name, BlahBlah.Phone, BlahBlah.SKU, BlahBlah.ModelNumber);

答案 1 :(得分:2)

试试这个 -

INSERT INTO dbo.Products
SELECT /*DISTINCT*/ Name, Phone, SKU = NULL, ModelNumber = NULL
FROM BlahBlah
WHERE SKU IS NULL AND ModelNumber IS NULL

UNION ALL

SELECT MAX(Name), MAX(Phone), SKU, ModelNumber 
FROM BlahBlah
WHERE SKU IS NOT NULL OR ModelNumber IS NOT NULL
GROUP BY SKU, ModelNumber 
相关问题