2015-07-31 2 views
0

У меня вопрос о SQL, особенно SQLite3. У меня две таблицы, назовем их main_table и temp_table. Эти таблицы основаны на одной и той же реляционной схеме, поэтому они имеют одинаковые столбцы, но разные строки (значения).SQL - обновить основную таблицу, используя временную таблицу

Теперь то, что я хочу сделать:

Для каждой строки main_table Я хочу, чтобы заменить его, если есть строка в temp_table с тем же ID. В противном случае я хочу сохранить старую строку в таблице.

Я думал об использовании какого-то joins, но это не обеспечивает то, что я хочу.

Не могли бы вы дать мне совет?

EDIT: ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ:

Я хотел бы избежать написания всех столбцов, потому что эти таблицы conains десятки атрибутов и так как я должен обновить все столбцы, не может быть необходимо выписать все из них.

+1

Совсем похоже на этот вопрос: http://stackoverflow.com/questions/329197/cross-table-update-in-sqlite3 – Wolph

+0

Нет подсказки о sqlite, но пахнет, как будто это работа для «MERGE» или «UPDATE» 'с подзапросом. –

+0

Зачем подбирать, @Thomas Tchnhernich? Просто обновите. –

ответ

1

Если таблицы имеют одинаковую структуру, вы можете просто использовать SELECT *:

BEGIN; 

DELETE FROM main_table 
WHERE id IN (SELECT id 
      FROM temp_table); 

INSERT INTO main_table 
SELECT * FROM temp_table; 

COMMIT; 

(Это будет также добавлять новые строки в temp_table, которые ранее не существовало в main_table.)

+0

Ницца! Спасибо! Элегантное муравьевое решение. –

0

У вас есть 2 подхода: существующие строки

  1. Update внутри main_table с данными из temp_table. Отношение будет основано на ID.

  2. Добавить столбец в temp_table, чтобы пометить все строки, которые должны быть переданы main_table или добавить таблицу в фильме хранить IDs, которые должны быть переданы. Затем удалите все строки, которые необходимо перенести из таблицы main_table, и вставьте соответствующие строки из temp_table, используя столбец с метками или новой таблицей.

Смежные вопросы