Bonjour,
Suite de mes aventures d'importation de valeurs d'une base non normalisée vers une normalisée...

1) Contexte
Dans la base actuelle, non normalisée, une table 'dictionnaire.dicodon' contient des variables que j'importe dans la table 'cartodico.variables' de la base normalisée.
Certaines de ces variables existantes ont des libellés, d'autres non.
Il y a des libellés supplémentaires dans la table 'dictionnaire.libelvar'. Il serait trop long et inutile d'expliquer pourquoi.
J'ai pu importer les 6103 variables différentes (sur 10030 lignes) de 'dictionnaire.dicodon' vers 'cartodico.variables' avec toutes les colonnes pour lesquelles j'avais des informations uniques pour chaque variable.
Je souhaite maintenant importer les libellés, d'abord de 'dictionnaire.dicodon', puis les libellés supplémentaires de 'dictionnaire.libelvar'.

2) Ce qui marche
La requête ci-dessous me permet d'importer 2814 libellés de 'dictionnaire.dicodon' donc dans 2814 variables sur 6103 de ma table 'cartodico.variables'.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/** Importation des libellés de 'dictionnaire.dicodon' dans 'cartodico.variables' */
CREATE TEMPORARY TABLE dictionnaire.variables_bis
SELECT D.libelle, tmp.VarIndex
FROM dictionnaire.dicodon D
INNER JOIN 
(
 SELECT CZ.ZDNom, CI.ImpNomTable, CV.VarAttribut, CV.VarIndex
 FROM cartodico.imports CI
 INNER JOIN cartodico.zonesdepot CZ ON CZ.ZDIndex = CI.ImpZoneDepot
 INNER JOIN cartodico.variables CV ON CI.ImpIndex = CV.VarImport
)tmp
ON tmp.ZDNom = D.base_orig
AND tmp.ImpNomTable = D.table_orig
AND tmp.VarAttribut = D.code_attr
GROUP BY D.base_orig, D.table_orig, D.code_attr
HAVING libelle <> "";
 
UPDATE cartodico.variables V
SET V.VarLibelleCourt = (SELECT VB.libelle
  FROM dictionnaire.variables_bis VB
WHERE V.VarIndex = VB.VarIndex);
 
DROP TABLE variables_bis;
La partie entre parenthèses 'SELECT CZ.ZDNom, CI.ImpNomTable, ...' me permet d'avoir la correspondance des 6103 variables avec celles de 'dicodon'
Le premier 'SELECT D.libelle, tmp.VarIndex...' me donne les 2814 libellés à importer et le n° de chaque variable où le libellé sera importé.

Après cette requête, j'ai donc dans 'cartodico.variables' :
- 2814 variables avec VarLibelleCourt NOT NULL ;
- 3289 variables avec VarLibelleCourt NULL.

3) Ce qui ne marche pas
J'essaie de faire pareil avec la requête ci-dessous pour importer les libellés supplémentaires de 'dictionnaire.libelvar' :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
CREATE TEMPORARY TABLE dictionnaire.variables_ter
SELECT L.libelle, tmp.VarIndex
FROM dictionnaire.libelvar L
INNER JOIN 
(
 SELECT CZ.ZDNom, CI.ImpNomTable, CV.VarAttribut, CV.VarIndex
 FROM cartodico.imports CI
 INNER JOIN cartodico.zonesdepot CZ ON CZ.ZDIndex = CI.ImpZoneDepot
 INNER JOIN cartodico.variables CV ON CI.ImpIndex = CV.VarImport
 WHERE VarLibelleCourt IS NULL 
)tmp
ON tmp.ZDNom = L.base_orig
AND tmp.ImpNomTable = L.table_orig
AND tmp.VarAttribut = L.code_attr
GROUP BY L.base_orig, L.table_orig, L.code_attr
HAVING L.libelle <> ""; 
 
UPDATE cartodico.variables V
SET V.VarLibelleCourt = (SELECT VT.libelle
  FROM dictionnaire.variables_ter VT
WHERE V.VarIndex = VT.VarIndex);
 
DROP TABLE dictionnaire.variables_ter;
De la même manière, la partie entre parenthèses 'SELECT CZ.ZDNom, CI.ImpNomTable, ...' me permet d'avoir la correspondance des 3289 variables dont le libellé est NULL avec les variables issues de 'dicodon'.
Le premier 'SELECT D.libelle, tmp.VarIndex...' me donne les 256 libellés à importer et le n° de chaque variable où le libellé sera importé.
Le problème est que le 'UPDATE' met à jour 3070 enregistrements de 'cartodico.variables', soit les 256 nouveaux libellés et met à NULL (valeur par défaut) tous les autres enregistrements !

J'ai essayé de déplacer ou de supprimer les parenthèses de la clause WHERE du UPDATE mais ça me renvoie une erreur à chaque fois.

Comment faire pour que ce UPDATE ne modifie que les 256 variables concernées et laisse les autres tranquilles ?