meilleur façon d'écrire une requête sql - SQL/NoSQL - Programmation
Marsh Posté le 13-02-2012 à 01:16:20
Salut
Puisqu'en final tu dois avoir ta target identique à ta source (bon déjà conceptuellement on se demande pourquoi 2 tables distinctes et on n'est plus du tout en 3FN mais bon...) ben autant vider totalement la target puis la remplir à partir de la source.
Sinon un delete from target where (idefactf, numligneff) not in (select idfact, numlignef from ligneFact) devrait aussi aller (sauf que ça n'insère pas les lignes de la source qui manquent)...
Marsh Posté le 13-02-2012 à 09:15:31
Tu peux le faire en 2 étapes pour eviter les problemes de deadlock et tout ce qui va avec.
Tu fais un FULL JOIN des deux tables, tu sauves le résultat dans une table temporaire et tu utilises le résultat pour faire les delete et puis les inserts.
Comme dit Sve@r, avoir deux tables comme ca n'a pas beaucoup de sens, donc une solution au probleme serai de revoir l'architecture de la DB
Marsh Posté le 14-02-2012 à 16:55:58
Sinon pour le in c'est pas moins optimal qu'une liste de where... Un exists est par contre souvent un plus efficient si on a un index à utiliser.
Marsh Posté le 12-02-2012 à 12:17:09
Salut,
Voici mon problème,
j'ai une table en source qui contient des lignes de facture :
table ligneFact
idfact numlignef ..
1 1
1 2
1 4
2 1
2 2
2 3
et une table en target sur un format presque identique (meme clés
table ligneFactFinal
idefactf numligneff
1 1
1 2
1 3
2 1
2 2
2 3
Je ne peux pas tronquer la table en target.
ce que je dois faire est d'insérer les lignes de la source à la target
en respectant la règle que si une ligne existe en target et plus en source, je dois la supprimer
ex la ligne 1 3
et mettre à jour les autres lignes
au final dans la target je devrais avoir, a même chose qu'en source
c'est à dire la ligne 1 4 en moins.
je pensai à faire d'abord une jointure externe en target et source
pour avoir les lignes qui sont en target et plus en source et ensuite les supprimé.
puis mettre à jour les autres lignes.
ce qui me dérange,
c'est que je fais
delete from matarget where (idefactf, numligneff) in
( select idefactf ,numligneff) from masource right outer join matarget...)
et ce qui me gêne est je fais un delete sur une table que je suis en train de lire (la target)
et que je fais un IN. de souvenir le IN c'est pas très optimal.
je comptais faire un exists
qu'en pensé vous?
avez-vous des conseil pour que ce soit optimal ?
merci