25

我有两张桌子

表格1:

name| count
xxx  | 1
yyyy | 2
zzzz | 3

表2:

name |count
xxx  | 1
aaa  | 5

我希望结果表如下表所示:

name | count
xxx  | 1
yyyy | 2
zzzz | 3
aaa  | 5

有谁知道如何做到这一点?

4

5 回答 5

46

您应该使用 UNION。

select * from table1
union
select * from table2

要插入表 1:

INSERT INTO TABLE1
select * from table2 
    where not exists(
            select * from table1 
                 where name=TABLE2.Name 
                       and count=TABLE2.Count
                     )
于 2012-12-28T06:20:19.357 回答
18

我们不需要任何特殊的 MERGE/UPSERT 命令。

  1. 将一个表中的行合并到另一个表中。

    INSERT INTO table1
      (SELECT * FROM table2
       WHERE name NOT IN
           (SELECT name FROM table1));
    
  2. 用于从旧表创建新表。

    CREATE TABLE new_table AS
    (SELECT * FROM table1
    UNION
    SELECT * FROM table2);
    
于 2015-09-07T14:32:24.953 回答
6

合并表和“更新插入”是一项常见的数据库任务,值得在 2021 年更新此答案。假设表相同,这是 postgresql 中最简单和最快的方法:

INSERT INTO table1
    SELECT * FROM table2
    ON CONFLICT DO NOTHING;

在填充 upsert 值之前,将“table2”创建为“table1”的空副本,以确保所有列都相同:

CREATE TABLE "table2"
    AS TABLE "table1"
    WITH NO DATA;

快速。

于 2021-04-21T16:22:21.693 回答
1

你能检查这是否在你的开发人员中工作,

MERGE INTO table1 x
USING table2 b
ON ( x.name=b.name and x.count=b.count)
WHEN NOT MATCHED THEN
INSERT (x.name,x.count)VALUES(b.name,b.count);
于 2012-12-28T07:24:40.160 回答
1

INSERT ... ON CONFLICT DO NOTHING比 快得多UNION。至少看看explain声明。

于 2021-03-06T22:56:00.383 回答