SQL Update d'une table à partir d'une autre table
Salut à toutes et à tous,
Grâce à l'aide de Random j'ai pas mal avancé dans mon code.
Tellement même que je suis arrivé au problème suivant. :mouarf:
Je m'explique :
J'importe les données d'une table qui se trouve dans une bdd externe et je détermine le numéro du secteur à partir du nom de la bdd distante.
J'alimente un table temporaire "PP_temp" qui contient les champs suivants :
NrPoint
X
Y
Z
PCode
Secteur
J'ai 3 tables non temporaires (je ne spécifie que les champs concernés) :
La table "PP" qui contient
NrPoint (Clé primaire)
X
Y
Z
PCode
La table "Secteurs" qui contient ... NrSecteur (Clé primaire)
La table "Sectorisation" qui contient
NrPoint
Secteur
ATTENTION, cette table ne contient pas de clé primaire et les 2 champs sont des entiers longs indexé avec doublons.
En fait cette table est la table intermédiaire afin de créer une liaison plusieur à plusieur entre les tables "PP" et "Secteurs". En effet, plusieurs points peuvent être dans un même secteur et un point peut être dans plusieurs secteurs s'il est à leur frontière.
De ma table PP_Temp je fais un
DoCmd.RunSQL ("INSERT INTO PP ( NrPoint, X, Y, Z, PCode ) SELECT [NrPoint], Format([X],'0.0000'), Format([Y],'0.0000'), Format([Z],'0.0000'), [PCode] FROM PP_temp;")
afin d'alimenter la table PP avec les points qui ne s'y trouveraient pas encore.
Vu qu'il y a une clé primaire sur le NrPoint, un point ne sera pas doublé.
Mes questions :
- Comment faire un update de la table PP à partir des données de la table PP_Temp ?
En effet, le insert into a ajouté les nouveaux points, mais si un point a changé de coordonnée, la table PP doit être mise à jour à partir des données de la table PP_Temp.
De plus, il me semble qu'un update ferait les mises à jour nécessaire mais ajouterait aussi les points inexistants.
J'ai essayé ce SQL sans résultat. Quel est la bonne synthaxe ?
Code:
1 2 3 4 5 6 7 8 9
|
Update PP _
SET ( X, Y, Z, PCode ) = _
( _
SELECT X, Y, Z, PCode FROM PP_Temp _
WHERE PP.NrPoint = PP_Temp.NrPoint _
) _
WHERE ( NrPoint ) IN ( SELECT NrPoint FROM PP_Temp) _
; |
- Vu que la table sectorisation n'a pas de clé primaire, comment faire pour n'avoir qu'une seule fois chaque lien entre un point et son secteur.
Si j'importe 3 fois le point 6250 du secteur 4, il se trouve 3 fois dans la table. Ce qui est logique, mais erronné.
Il me faudrait un update de la table sectorisation mais uniquement si le point ET son secteur ne sont pas identiques à ceux de la table PP_temp. Mais je n'y arrive pas.
En effet je peux avoir
NrPoint Secteur
6250 3
6250 4
6251 3
6252 3
6253 4
Mais je ne peux pas avoir
NrPoint Secteur
6250 3
6250 4
6250 4
6250 4
6251 3
6252 3
6253 4
Or c'est ce qui se produit si j'importe 3 fois les points du secteur 4. Ce qui peut arriver si on met 3 fois le secteur 4 à jour.
Merci de vos z'avis z'avisés,
Jean-Marc