我有两个具有相同模式的表,表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]
问题:这是什么语法 - 特别是括号中的部分?
答案 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);
有关使用合并的更多信息,请访问: