Как объединить идентичные таблицы в PostgreSQL? - PullRequest
1 голос
/ 23 февраля 2012

Как объединить идентичные таблицы в 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|F

Обязательные критерии: серийные номера должны оставаться уникальными для всех строк после объединения.

У меня есть два вопроса:

  1. Может кто-нибудь помочь мне разобраться, как создать запрос для объединения двух идентичных таблиц в PostgreSQL 8.4+ или 9+?

  2. Есть ли способ в командах PostgreSQL, PgAdmin или какой-либо утилите напрямую объединить две таблицы?

Пожалуйста, ведите меня.

Ответы [ 2 ]

1 голос
/ 23 февраля 2012
 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 .... 
0 голосов
/ 24 февраля 2012

Таким образом, вы

  • сохранить все строки (включая дубликаты)
  • сохранить неизменные идентификаторы для значений из первой таблицы
  • сохранить идентификаторы, которые вы можете сопоставить со второй таблицей

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;

Вам необходим PostgreSQL 8.4 или новее для CTE .
Вы можете просто взглянуть на максимум tbl1 и увеличить ID с tbl2 на большее круглое число, большее этого.

Если вам не нужны предыдущие идентификаторы, избавьтесь от дубликатов значений и у вас есть идентификаторы без пробелов (изначально), тогда ответ @ a_horse'e будет вам лучше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...