从表a插入表b,其中b中的记录不存在

时间:2012-12-17 15:24:35

标签: sql database

我有两个具有相同模式的表,表A和表B:

| Table [A]        | Table [B]   
| id    value      | id    value
| 1     15         | 1     19
| 2     18         | 3     28
| 5     22         | 4     39

我想这样做:

insert into a select * from b where [b.id not exists in a]

问题:这是什么语法 - 特别是括号中的部分?

3 个答案:

答案 0 :(得分:4)

使用INSERT INTO..SELECT语句和LEFT JOIN

INSERT INTO tableB (id, Value)
SELECT  a.id, a.value
FROM    tableA a
        LEFT JOIN tableB b 
            ON a.ID = b.ID
WHERE   b.id IS NULL

答案 1 :(得分:3)

像这样:

INSERT INTO a(id, value)
SELECT * 
FROM b 
WHERE b.id NOT IN (SELECT id from a)
  AND b.id IS NOT NULL ; 

请注意:使用谓词NULL时,您必须注意IN值。否则,请使用NOT EXISTS谓词,它更安全,或使用{@ 1}},就像@kuyaJohn所建议的那样。

答案 2 :(得分:1)

如果您使用的是SQL 2008 +,您还可以使用合并来实现此目的,这样您就可以轻松地为目标表中不存在行的位置添加条件,还可以为此做些什么如果ID匹配但值不同(可能更新)或者目标表中有一行在源中不存在(可能删除):

MERGE TableB AS TARGET
USING TableA AS SOURCE
ON (target.ID = source.ID) 

WHEN NOT MATCHED BY TARGET
    THEN INSERT (ID, Value) VALUES (source.ID, source.Value);

有关使用合并的更多信息,请访问:

Inserting, Updating, and Deleting Data by Using MERGE