Вставить ничего не делать и наоборот - 2 таблицы в Postgresql - PullRequest
0 голосов
/ 06 февраля 2020

У меня есть две таблицы, как показано ниже

Table_1

id  first_name  last_name   email
1   Artemas     Jack        asaggs0@si.edu
2   Caro        John        cstot1@businessinsider.com
3   Maire       Disha       mtilte2@answers.com
4   Cristiano   Herreros    cherreros3@xing.com
5   Mirabelle   Muschette   mmuschette4@discuz.net

Table_2

id  first_name  last_name   email
1   Artemas     Jack123     asaggs0@si.edu
2   Caro        John        cstot1@businessinsider.com
4   Cristiano   Herreros    cherreros3@xing.com
6   Arjun       Master      Arjunmas@gmail.com

Мало Очки

  1. Table_2 - это недавняя таблица (с обновленными данными)

  2. Что я хотел бы сделать, это обновить Таблицу_1 на основе Таблицы_2, но

    1. не беспокоить дублирующиеся строки. Поскольку нет никаких изменений (например: Id = 2,4 в table_1 также присутствуют в table_2)
    2. Обновить измененные строки (например: Id = 1 в table_1 имеет обновленную фамилию в table_2. Может быть любым из столбцов. Мы должны взглянуть на столбец Id и обновить его при необходимости)
    3. Не удалять строки из таблицы_1, которых нет в таблице_2 (например: Id = 3,5 в таблице_1 )

Я пытался что-то подобное ниже, но это не помогает

INSERT INTO table_1 VALUES (SELECT * FROM table_2) ON CONFLICT DO NOTHING;

Но не уверен, как мне сохранить записи, такие как id = 3 & id = 5 как есть

Я ожидаю, что мой вывод будет таким, как показано ниже

Выход

id  first_name  last_name   email
1   Artemas     Jack123     asaggs0@si.edu
2   Caro        John        cstot1@businessinsider.com
3   Maire       Disha       mtilte2@answers.com
4   Cristiano   Herreros    cherreros3@xing.com
5   Mirabelle   Muschette   mmuschette4@discuz.net
6   Arjun       Master      Arjunmas@gmail.com

1 Ответ

1 голос
/ 06 февраля 2020

Вы можете использовать on conflict do update и использовать предложение WHERE только для изменения строк, где что-то меняется

INSERT INTO table_1 (id, first_name, last_name, email)
SELECT id, first_name, last_name, email
FROM table_2
  ON CONFLICT (id) DO UPDATE
    set first_name = excluded.first_name,
        last_name = excluded.last_name, 
        email = excluded.email
where (table_1.first_name, table_1.last_name, table_1.email) 
         IS DISTINCT FROM (table_2.first_name, table_2.last_name, table_2.email);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...