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

39

SQLITE

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

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

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

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

Идеи?

  • 0
    Было бы что-то вроде этого? stackoverflow.com/questions/2717590/...
  • 1
    ОБНОВЛЕНИЕ Destination SET country = (выберите страну из источника, где id = Destination.id) ГДЕ СУЩЕСТВУЕТ (выберите 1 из источника, где id = Destination.id);
Теги:

4 ответа

95
Лучший ответ
INSERT INTO Destination SELECT * FROM Source;

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

  • 1
    это не сработает, так как мне нужно присоединиться к полю ID и обновить только одно поле (Страна).
  • 4
    Вы можете легко изменить выражение в запросе SELECT чтобы оно соответствовало вашей фактической схеме таблицы.
Показать ещё 1 комментарий
3

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

UPDATE Table1 set Name=(select t2.Name from Table2 t2 where t2.id=Table1.id)
  • 0
    Это приведет к удалению данных из таблицы table1, если в table2 меньше строк, чем в table1.
1

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

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

  • 0
    Мы обновляем одну таблицу на другую только для очистки данных. Мне просто нужно обновить поля страны (правописание изменений)
0

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

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;

Ещё вопросы

Сообщество Overcoder
Наверх
Меню