Je travaille avec deux bases de données, primaire et secondaire. les deux contiennent le même schéma. maintenant, je ne peux pas mettre à jour la colonne de la base de données primaire avec le contenu de la même colonne de la base de données secondaire à condition que les données de la base de données secondaire ne soient pas NULL.

ATTACH "secondary.db" as second;
UPDATE main.table set main.value = coalesce((SELECT value FROM second.table),main.value);

Mais le code ci-dessus ne fonctionne pas et seule la première valeur de la colonne de la base de données secondaire est copiée dans toutes les valeurs de la colonne de la base de données primaire.

Pour par ex. base de données primaire:

index, value
  1,    45
  2,    56
  3,    23

Base de données secondaire:

index, value
  1,   NULL
  2,   55
  3,   NULL

Base de données des résultats attendus:

index, value
  1,    45
  2,    55
  3,    23

Aucune suggestion?

Ici vous pouvez voir ce que j'essaye: http://sqlfiddle.com/#!5/845545/1

1
rkthebest 31 août 2020 à 19:22

2 réponses

Meilleure réponse

Je pense que vous avez besoin d'une sous-requête corrélée :

update main.table t
    set main.value = coalesce((select t2.value from second.table t2 where t2.index = t.index),
                              main.value
                             );

Ou, plus efficacement. Filtrez les lignes et n'utilisez pas coalesce():

update main.table t
    set main.value = (select t2.value from second.table t2 where t2.index = t.index)
    where exists (select 1 from second.table t2 where t2.index = t.index and t2.value is not null)
0
Gordon Linoff 1 sept. 2020 à 00:31

Je n'ai pas suivi SQLite depuis quelques années, mais je pense que vous pouvez maintenant le faire avec une instruction UPDATE FROM comme celle-ci:

UPDATE 
   main
SET 
   main.value = Coalesce (main.value, second.value)
FROM
      main.table
   INNER JOIN
      second.table
   ON main.id = second.id
1
Kuru 2 sept. 2020 à 14:32