SQLITE
У меня есть 2 таблицы "Source" и "Destination", которые имеют одинаковые поля. ID и COUNTRY, хотя они оба имеют другие поля, которые не являются общими.
Мне нужно скопировать значение Source.Country в Destination.Country, где соединение находится в ID
Для жизни меня я не могу заставить Sqlite сделать это.
В SQL Server и т.д. это очень простая задача.
Идеи?
INSERT INTO Destination SELECT * FROM Source;
См. SQL как понятны SQLite: INSERT для формального определения.
SELECT
чтобы оно соответствовало вашей фактической схеме таблицы.
Если у вас есть данные, уже присутствующие в обеих таблицах, и вы хотите обновить значения столбца таблицы на основе некоторого условия, используйте этот
UPDATE Table1 set Name=(select t2.Name from Table2 t2 where t2.id=Table1.id)
Если вы копируете такие данные, это, вероятно, означает, что ваш datamodel не полностью нормализован, не так ли? Можно ли составить один список стран и сделать ДОПОЛНЕНИЕ больше?
Вместо JOIN вы также можете использовать виртуальные таблицы, поэтому вам не нужно менять запросы в вашей системе.
Я боролся с этим, и я знаю, что есть другие варианты, но я пришел к выводу, что самый безопасный шаблон:
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
равно 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;