Sql 将唯一数据从一个表复制到另一个表

Sql 将唯一数据从一个表复制到另一个表,sql,postgresql,insert,Sql,Postgresql,Insert,我有两张桌子表A是主表,表B是辅助表。现在,我需要从表B复制到表A中,仅复制表A中不存在的带有辅助id的行 表A id |aux_id | firstname | lastname 表B aux_id | firstname | lastname 我正在努力,但显然没有成功 INSERT INTO table_A(aux_id,firstname,lastname)(SELECT aux_id,firstname,lastname FROM table_B WHERE aux_id !=

我有两张桌子<代码>表A是主表,
表B
是辅助表。现在,我需要从
表B
复制到
表A
中,仅复制
表A中不存在的带有
辅助id的行

表A

id |aux_id | firstname | lastname
表B

 aux_id | firstname | lastname
我正在努力,但显然没有成功

INSERT INTO table_A(aux_id,firstname,lastname)(SELECT aux_id,firstname,lastname FROM table_B WHERE aux_id != aux_id);
我得到:
INSERT 0 0


这是错误的,因为我确信表B中有新的条目。

有很多方法可以做到这一点(
左连接
不存在
不在
中)。如果您正在学习SQL,
不在
中,可能是第一次接触时最容易的方法:

INSERT INTO table_A(aux_id, firstname, lastname)
    SELECT aux_id, firstname, lastname
    FROM table_B
    WHERE b.aux_id NOT IN (SELECT a.aux_id FROM table_A a);
我应该说我更喜欢
不存在

    WHERE NOT EXISTS (SELECT 1 FROM table_A a WHERE a.aux_id = b.aux_id);

原因与
NULL
值的处理有关。
不存在
符合您的期望<如果子查询返回一个
NULL
值,则code>NOT IN
永远不会返回true。

有很多方法可以做到这一点(
左连接
不存在
不在
)。如果您正在学习SQL,
不在
中,可能是第一次接触时最容易的方法:

INSERT INTO table_A(aux_id, firstname, lastname)
    SELECT aux_id, firstname, lastname
    FROM table_B
    WHERE b.aux_id NOT IN (SELECT a.aux_id FROM table_A a);
我应该说我更喜欢
不存在

    WHERE NOT EXISTS (SELECT 1 FROM table_A a WHERE a.aux_id = b.aux_id);

原因与
NULL
值的处理有关。
不存在
符合您的期望<如果子查询返回一个
NULL
值,则code>NOT IN
永远不会返回true。

效率更高一些。SELECT 1不要求postgresql分配结果集,SELECT*就是这样做的。由于我们只测试是否有任何结果,分配的努力是毫无价值的,它更有效一些。SELECT 1不要求postgresql分配结果集,SELECT*就是这样做的。由于我们只测试是否有任何结果,分配的努力是毫无价值的。