skip/ignore /不插入重复的行

rus*_*sds 3 sql merge insert sql-server-2008

这就是我想要的:将行从tableA复制到tableB,但不是已经存在于tableB中的任何行.没有PK或识别,我只想检查每个字段,如果匹配的行包含所有相同的字段,则不插入.我试过INSERT和MERGE:

 --try with INSERT
 INSERT TableB(col1,col2,col3,col4,col5,col6, etc.)
 SELECT (col1,col2,col3,col4,col5,col6, etc.)  
 FROM tableA as src
 WHERE NOT EXISTS (SELECT 1 FROM TableB as T
            WHERE               
            T.col1 = src.col1 AND
            T.col2 = src.col2 AND
            T.col3 = src.col3 AND
            T.col4 = src.col4 AND
            T.col5 = src.col5 AND
            T.col6 = src.col6, etc.)
Run Code Online (Sandbox Code Playgroud)

我也尝试过MERGE:

  MERGE INTO tableA src
  USING tableB T
  ON (
            T.col1 = src.col1 AND
            T.col2 = src.col2 AND
            T.col3 = src.col3 AND
            T.col4 = src.col4 AND
            T.col5 = src.col5 AND
            T.col6 = src.col6, etc.)
  WHEN NOT MATCHED THEN
  INSERT (col1,col2,col3,col4,col5,col6, etc.)
  VALUES (col1,col2,col3,col4,col5,col6, etc.);
Run Code Online (Sandbox Code Playgroud)

两者都完全相同:我会进行插入(或合并),最初所有行都被导入,这很好,但是第二次尝试(应该插入/合并0行)它将插入/合并60%的行.

我相信这个问题是因为我没有PK,这是我在其他帖子上看到的.我只是想在所有领域匹配,这可能吗?我错过了什么吗?

感谢您的任何建议/指导!

hol*_*hol 6

您可以使用EXCEPT

INSERT INTO table1
SELECT * from table2
EXCEPT 
SELECT * from table1;
Run Code Online (Sandbox Code Playgroud)

看看这里的小提琴