OVH Cloud OVH Cloud

comparaison et mise à jour de tables

1 réponse
Avatar
le_scrameustache
Bonjour,

j'ai besoin d'un avis sur la methodologie à mettre en place afin de faire
une misa à jour d'une table en fonction d'une autre. Je tiens à préciser que
je ne peux utiliser de triggers, mais je souhaiterais cependant avoir une
méthode rigoureuse.

Je possède deux tables, l'une est "table_source", l'autre est "table_cible".
Chacune à la même structure.

J'aimerais pouvoir mettre à jour la table_cible à partir de table_source.
Ainsi, si la ligne de table_source est dans table_cible, je ne fais rien, si
la ligne n'existe que dans table_source mais pas dans table_cible, j'insère,
et enfin, s'il existe une modification quelconque de la ligne (hormis l'ID
qui est clé primaire) je mets à jour la ligne dans la table_cible.

Voici mon code qui ne marche pas en cas de modifiaction d'une ligne de la
table_source car ce code insère dans ce cas un doublon dans la table_cible.

Citation:
insert into table_cible select * from table_source where not exists
(select * from table_cible where and table_source.id = table_ref.id
table_source.champ1 = table_ref.champ1 and table_ref.champ2 =
table_source.champ2)


Alors, je ne sais pas la méthodologie la plus efficace et optimisée à
employer pour faire ce test. Faire un long test en comparant l'ID, puis le
contenu de chaque champ, ne me semble pas très beau!

Si quelqu'un pouvait m'aider, ça serait très sympa.

1 réponse

Avatar
Mystique
slt,

Pense à mettre "distinct" dans tes select et normalement tu ne devrais pas
avoir de doublon.

"le_scrameustache" wrote:

Bonjour,

j'ai besoin d'un avis sur la methodologie à mettre en place afin de faire
une misa à jour d'une table en fonction d'une autre. Je tiens à préciser que
je ne peux utiliser de triggers, mais je souhaiterais cependant avoir une
méthode rigoureuse.

Je possède deux tables, l'une est "table_source", l'autre est "table_cible".
Chacune à la même structure.

J'aimerais pouvoir mettre à jour la table_cible à partir de table_source.
Ainsi, si la ligne de table_source est dans table_cible, je ne fais rien, si
la ligne n'existe que dans table_source mais pas dans table_cible, j'insère,
et enfin, s'il existe une modification quelconque de la ligne (hormis l'ID
qui est clé primaire) je mets à jour la ligne dans la table_cible.

Voici mon code qui ne marche pas en cas de modifiaction d'une ligne de la
table_source car ce code insère dans ce cas un doublon dans la table_cible.

Citation:
insert into table_cible select * from table_source where not exists
(select * from table_cible where and table_source.id = table_ref.id
table_source.champ1 = table_ref.champ1 and table_ref.champ2 =
table_source.champ2)


Alors, je ne sais pas la méthodologie la plus efficace et optimisée à
employer pour faire ce test. Faire un long test en comparant l'ID, puis le
contenu de chaque champ, ne me semble pas très beau!

Si quelqu'un pouvait m'aider, ça serait très sympa.