在将数据从源表导入目标表时过滤重复记录

时间:2013-06-17 04:56:52

标签: sql sql-server sql-server-2008 sql-server-2008-r2

对于你们中的一些人来说,这可能是一个简单的查询。但是我在Sql中并不强大,所以期待解决我的问题。

我有2个表,ProductVenueImportSupplierVenueImport

我们正在使用 MERGE 子句和SupplierVenueImport表将所有记录从ProductVenueImport转储到TempTemp将包含来自SupplerVenuImportTemp表的有效记录,我们将记录导入ProductVenueImport

但在将数据从ProductVenueImport表导入Temp之前,我需要检查目标中的重复记录(ProductVenueImport)。

例如,如果我要导入名称为“A”的记录,我需要查看ProductVenueImport是否已存在“A”。如果它不存在那么我只需要插入“A”,否则不会。

有人能告诉我怎么做吗?

仅使用游标选项吗?

谢谢, 纳雷什

4 个答案:

答案 0 :(得分:1)

假设Temp表本身没有重复项,您可以像这样使用MERGE:

  1. 插入不存在的产品。

  2. 如果是现有产品,请执行NO-OP。

  3. 在OUTPUT子句中使用$action标记哪些行被考虑插入(和插入)以及哪些行用于更新(但未真正更新)。

  4. 这就是我的意思:

    DECLARE @noop int;  -- needed for the NO-OP below
    
    MERGE INTO ProductVenueImport AS tgt
    USING Temp AS src
    ON src.ProductID = tgt.ProdutID
    WHEN NOT MATCHED THEN
      INSERT (    column1,     column2, ...)
      VALUES (src.column1, src.column2, ...)
    WHEN MATCHED THEN
      UPDATE SET @noop = @noop  -- the NO-OP instead of update
    OUTPUT $action, src.column1, src.column2, ...
      INTO anotherTempTable
    ;

答案 1 :(得分:0)

我认为这样做会:

INSERT INTO PRODUCTTBL(FEILD1, FIELD2, FIELD3, FIELD4, FIELD5)
SELECT (FIELD1,FIELD2,FIELD3,FIELD4,FIELD5) FROM TEMP WHERE CRITERIAFIELD NOT IN(SELECT     DISTINCT CRITERIAFIELD FROM PRODUCTTBL)

答案 2 :(得分:0)

这应该允许您检查表中的重复项

从tablename中选择columnname 按列名分组 有计数(列名)> 1

答案 3 :(得分:0)

对不起,如果我没有得到正确的问题,你不能使用源表上的合并语句“当不匹配插入”单独插入新记录时

所以在你的情况下它应该是这样的

merge into ProductVenueImport using temp on (<condition for duplicate>)
when not matched then insert <clause>;

merge子句将确保没有重复的记录插入到源表中。