【问题标题】:How to Merge Identical Tables in PostgreSQL?如何在 PostgreSQL 中合并相同的表?
【发布时间】:2012-02-23 08:28:53
【问题描述】:

如何在 PostgreSQL 中合并相同的表以强制使用不同的序列号。

我的场景:第一列是一个大序列号,主键设置为按序列中的增量 1 自动增长。但它们都以 1,2,3,4.... 开头。

表:数据1

1|A 2|B 3|C

表:数据2

1|D 2|E 3|F

结果应该是:

1|A 2|B 3|C 4|D 5|E 6|楼

要求条件:合并后所有行的序列号应保持唯一。

我有两个问题:

  1. 谁能帮我弄清楚如何在 PostgreSQL 8.4+ 或 9+ 中创建一个查询来合并两个相同的表?

  2. 在 PostgreSQL 命令或 PgAdmin 或某些实用程序中是否有直接合并两个表的方法?

请指导我。

【问题讨论】:

    标签: sql postgresql merge


    【解决方案1】:
     SELECT *
     FROM (    
        SELECT row_number() over () as rn, 
              code
        FROM ( 
          SELECT code 
          FROM table_1
          UNION 
          SELECT code
          FROM table_2
        ) as t1
     ) as t2
     ORDER BY rn
    

    使用上面的结果你可以创建一个新表:

    CREATE TABLE new_table 
    AS
    SELECT .... 
    

    【讨论】:

    • 你想要 UNION ALL 而不是 UNION (这将消除重复的“代码”值)
    • 我也想过这个问题,但我并不完全确定。从示例中并不清楚,user1227809 没有提到任何表明应该保留重复项的内容。
    【解决方案2】:

    这样你

    • 保留所有行(包括重复行)
    • 保持第一个表中值的 ID 不变
    • 保留可以与第二个表匹配的 ID

    WITH x AS (
        SELECT max(id) AS x
        FROM tbl1
        ) 
    SELECT id, val
    FROM   tbl1
    UNION  ALL
    SELECT x + id, val
    FROM   tbl2, x
    ORDER  BY id;
    

    CTE 需要 PostgreSQL 8.4 或更高版本。
    你可以看看tbl1 的最大值,然后将tbl2 的ID 增加一个比这更大的整数。

    如果您不关心以前的 ID,摆脱重复值并拥有没有间隙的 ID(最初),那么 @a_horse'e 答案对您来说更好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-16
      • 2017-11-24
      • 2012-12-13
      • 1970-01-01
      • 2022-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多