sqlite копировать данные из одной таблицы в другую - PullRequest
60 голосов
/ 27 ноября 2010

SQLITE

У меня есть 2 таблицы «Источник» и «Назначение», которые имеют одинаковые поля.ID и СТРАНА, хотя у них обоих есть и другие поля, которые не являются общими.

Мне нужно скопировать значение Source.Country в Destination.Country, где объединение имеет идентификатор

Дляя не могу заставить Sqlite сделать это.

В SQL Server и т. д. это очень простая задача.

Идеи?

Ответы [ 4 ]

129 голосов
/ 27 ноября 2010
INSERT INTO Destination SELECT * FROM Source;

См. SQL в понимании SQLite: INSERT для формального определения.

9 голосов
/ 11 марта 2016

Если у вас есть данные, уже присутствующие в обеих таблицах, и вы хотите обновить значения столбцов таблицы на основе какого-либо условия, используйте это

UPDATE Table1 set Name=(select t2.Name from Table2 t2 where t2.id=Table1.id)
2 голосов
/ 04 мая 2017

Я боролся с этим, и я знаю, что есть другие варианты, но я пришел к выводу, что самый безопасный шаблон:

create table destination_old as select * from destination;

drop table destination;

create table destination as select
d.*, s.country
from destination_old d left join source s
on d.id=s.id;

Это безопасно, потому что у вас есть копия destination до того, как вы его изменили.Я подозреваю, что операторы обновления с объединениями не были включены в SQLite, потому что они мощные, но немного рискованные.

Используя приведенный выше шаблон, вы получите два country поля.Вы можете избежать этого, явно указав все столбцы, которые вы хотите извлечь из destination_old, и, возможно, используя coalesce, чтобы получить значения из destination_old, если поле country в source равно нулю.Так, например:

create table destination as select
d.field1, d.field2,...,coalesce(s.country,d.country) country
from destination_old d left join source s
on d.id=s.id;
1 голос
/ 27 ноября 2010

Если вы копируете данные подобным образом, это, вероятно, означает, что ваша модель данных не полностью нормализована, верно?Можно ли составить один список стран и сделать больше JOIN?

Вместо JOIN вы также можете использовать виртуальные таблицы, чтобы вам не приходилось изменять запросы в вашей системе.

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