sqlite копіює дані з однієї таблиці в іншу


77

SQLITE

У мене є 2 таблиці "Джерело" та "Пункт призначення", які мають однакові поля. ID та COUNTRY, хоча в обох є й інші поля, які не є спільними.

Мені потрібно скопіювати значення Source.Country до Destination.Country, де об’єднання має ідентифікатор

За своє життя я не можу змусити Sqlite це зробити.

У SQL Server і т. Д. Це надзвичайно проста задача.

Ідеї?


Було б щось подібне? stackoverflow.com/questions/2717590/…
Том,

1
ОНОВИТИ НАБІР НАЗНАЧЕННЯ країна = (вибрати країну з джерела, де id = Destination.id) ДЕ ІСНУЄ (виберіть 1 із джерела, де id = Destination.id);
Ян Вінк,

Відповіді:


155
INSERT INTO Destination SELECT * FROM Source;

Формальне визначення див. У розділі SQL, як розуміється SQLite: INSERT .


2
це перемогло; не працюватиму, оскільки мені потрібно приєднатися до поля ID та оновити лише одне поле (Країна).
Ян Вінк,

5
Ви можете легко змінити вираз у SELECTзапиті відповідно до вашої фактичної схеми таблиці.
joschi

9
Примітка для нубів (як я). Якщо ви використовуєте кілька значень, обов’язково вкажіть SELECTзапит у дужках, наприкладINSERT INTO users2(name, name2) VALUES ((SELECT name FROM users),(SELECT name2 FROM users));
льоду

1
@ice ツ Це просто вставляє один запис у таблицю, хоча у мене є кілька записів у таблиці моїх користувачів
Amardeep Kumar Agrawal

11

Якщо у вас є дані, що вже є в обох таблицях, і ви хочете оновити значення стовпців таблиці на основі певної умови, використовуйте це

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

Це призведе до видалення даних з table1, якщо table2 має менше рядків, ніж table1.
zelusp

4

Я боровся з цим, і знаю, що є й інші варіанти, але я прийшов до висновку, що найбезпечніший зразок:

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

Якщо ви копіюєте такі дані, це, мабуть, означає, що ваша модель даних не повністю нормалізована, чи не так? Чи можна скласти один список країн і ПРИЄДНАТИСЯ більше?

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


Ми оновлюємо з однієї таблиці до іншої лише вправу на очищення даних. Мені просто потрібно оновити поля країни (зміни правопису)
Ян Вінк,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.