SQLite можно скопировать данные из одной таблицы в другую

SQLite в

У меня есть 2 таблицы "источник" и "назначение", которые имеют те же поля. ID и COUNTRY, хотя у них обоих есть и другие поля, которые не являются общими.

Мне нужно скопировать источник.Значение страны назначения.Страна, где соединение находится на ID

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

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

идеи?

4 ответов


INSERT INTO Destination SELECT * FROM Source;

посмотреть SQL в понимании SQLite: INSERT формальное определение.


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

UPDATE Table1 set Name=(select t2.Name from Table2 t2 where t2.id=Table1.id)

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

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


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

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 прежде чем вы изменили его. Я подозреваю, что инструкции update с соединениями не были включены в SQLite, потому что они мощные, но немного рискованные.

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

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;