- Nogs,
Bonjour à tous,
je suis dans une situation ou j’ai une table «DESTINATION» contenant N colonnes avec un identifiant ID. J’ai une autre table «SOURCE», ayant le même schéma que DESTINATION le le même ID.
Je dois mettre à jour toutes les colonnes des lignes de DESTINATION qui depuis SOURCE ou ID est égal, et ajouter les lignes DANS DESTINATION qui ne sont pas présentes dans SOURCE.
Un exemple.
La table SOURCE:
col_a | col_b | ID
——————————————————
a | a | 1
b | b | 2
c | c | 4
La table DESTINATION:
col_a | col_b | ID
——————————————————
z | z | 1
x | x | 2
y | y | 3
Le résultat attendu dans DESTINATION:
col_a | col_b | ID
——————————————————
a | a | 1
b | b | 2
c | c | 4
y | y | 3
Mon implémentation naïve:
- Supprimer les lignes de la table DESTINATION contenues dans la table SOURCE:
DELETE source_table
FROM SOURCE source_table
JOIN DESTINATION destination_table ON source_table.ID = destination_table.ID;
- Insérer les lignes de SOURCE dans DESTINATION:
INSERT INTO DESTINATION
SELECT * FROM SOURCE ;
Cela marche mais je suis convaincu qu’il y a plus optimisé alors si vous partagez mon avis et que vous savez comment faire: vous combleriez ma curiosité avec une réponse .
Attention , il y a une contrainte: la/les requête doivent être agnostiques du nom des colonnes autres que «ID» (je dois appliquer ces transformations à plusieurs tables ayant des schémas différents mais ayant toutes une colonne ID de même type).
Pour être honnête c’est cette contrainte qui m’empêche de former une requête plus optimisée à base d’UPDATE puis INSERT. D’ailleurs mais les infos que j’ai trouvé en ce sens me laissent penser que ma question n’a peut être pas de réponses plus optimisées que ma réponse «naïve».