SQL在列A匹配而列B不匹配时插入数据

SQL在列A匹配而列B不匹配时插入数据,sql,sql-server,join,insert,Sql,Sql Server,Join,Insert,我有一个SQL Insert语句,只有在表2中不存在记录或者表1中的邮政编码发生更改时,才需要将记录插入另一个表中。我尝试了以下方法,但它抛出了一个错误,这就是我要寻找的逻辑: INSERT INTO table2 SELECT id, zip FROM table1 t1 JOIN table2 t2 ON t1.id = t2.id and t1.zip <> t2.zip 如果id在表2中根本不存在,我还需要它来插入记录。我已经用谷歌搜索出了这个问题的答案,但似乎在任何地方

我有一个SQL Insert语句,只有在表2中不存在记录或者表1中的邮政编码发生更改时,才需要将记录插入另一个表中。我尝试了以下方法,但它抛出了一个错误,这就是我要寻找的逻辑:

INSERT INTO table2
SELECT id, zip
FROM table1 t1
JOIN table2 t2
ON t1.id =  t2.id and t1.zip <> t2.zip

如果id在表2中根本不存在,我还需要它来插入记录。我已经用谷歌搜索出了这个问题的答案,但似乎在任何地方都找不到解决方案

您只需要一个WHERE NOT EXISTS子句

INSERT INTO table2
SELECT id, zip
FROM table1
WHERE NOT EXISTS (SELECT 1 FROM table2 WHERE table2.id = table1.id AND table2.zip = table1.zip)
这个怎么样

INSERT INTO table2
SELECT t2.id, t2.zip
FROM table1 t1
LEFT OUTER JOIN table2 t2
ON t1.id = t2.id
WHERE (t1.id IS NULL OR t2.zip <> t1.zip)

另外,一定要弄清楚您要的是哪个表的id和zip列。

在进行插入时,您应该始终包括列列表。其次,您的查询没有完全捕获您的逻辑。您需要一个左外部联接来查找第二个表中不存在的记录。也许这可以满足您的要求:

INSERT INTO table2(id, zip)
SELECT id, zip
FROM table1 t1 LEFT JOIN
     table2 t2
     ON t1.id = t2.id
WHERE (t1.zip <> t2.zip) or (t2.zip is null)

根据您的sql server版本,合并可能是一个很好的起点。谢谢,我做了t2。id改为空,并且工作正常。我已经在插入中添加了列名,但为了简洁起见,没有在此处添加列名