SQLITE
J'ai 2 tables "Source" et "Destination" qui ont les mêmes champs. ID et COUNTRY, bien qu'ils aient tous les deux d'autres champs qui ne sont pas en commun.
Je dois copier la valeur Source.Country dans Destination.Country où la jointure est sur l'ID.
Pour ma vie, je ne peux pas faire faire ça à SQLite.
Dans SQL Server, etc., cette tâche est extrêmement simple.
Des idées?
INSERT INTO Destination SELECT * FROM Source;
Voir SQL comme compris par SQLite: INSERT pour une définition formelle.
Si des données sont déjà présentes dans les deux tables et que vous souhaitez mettre à jour les valeurs d'une colonne de table en fonction de certaines conditions, utilisez cette commande.
UPDATE Table1 set Name=(select t2.Name from Table2 t2 where t2.id=Table1.id)
J'ai été aux prises avec cela, et je sais qu'il existe d'autres options, mais je suis parvenu à la conclusion que le modèle le plus sûr est le suivant:
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;
C'est sûr parce que vous avez une copie de destination
avant de la modifier. Je soupçonne que les instructions de mise à jour avec des jointures n'ont pas été incluses dans SQLite car elles sont puissantes mais un peu risquées.
En utilisant le modèle ci-dessus, vous vous retrouvez avec deux champs country
. Vous pouvez éviter cela en indiquant explicitement toutes les colonnes que vous voulez récupérer de destination_old
et peut-être utiliser coalesce
pour récupérer les valeurs de destination_old
si le champ country
dans source
est nul. Donc par exemple:
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;
Si vous copiez des données de cette manière, cela signifie probablement que votre modèle de données n'est pas entièrement normalisé, n'est-ce pas? Est-il possible de faire une liste de pays et de faire un JOIN plus?
Au lieu d'un JOIN, vous pouvez également utiliser des tables virtuelles pour ne pas avoir à modifier les requêtes de votre système.