2

我有两个具有相同架构的表,表 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]

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

4

3 回答 3

6

使用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
于 2012-12-17T15:26:02.790 回答
4

像这样:

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

请注意:NULL使用 predicate 时,您必须注意值IN。否则使用NOT EXISTS谓词,它更安全,或者使用LEFT JOIN@kuyaJohn 建议的类似。

于 2012-12-17T15:25:28.593 回答
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);

更多关于使用合并的信息可以在这里找到:

使用 MERGE 插入、更新和删除数据

于 2012-12-17T15:50:37.673 回答