meilleur façon d'écrire une requête sql

meilleur façon d'écrire une requête sql - SQL/NoSQL - Programmation

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
 
 
 
 
 

Reply

Marsh Posté le 12-02-2012 à 12:17:09   

Reply

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)...

Reply

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 :)

Reply

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.


---------------
| AMD Ryzen 7 7700X 8C/16T @ 4.5-5.4GHz - 64GB DDR5-6000 30-40-40 1T - AMD Radeon RX 7900 XTX 24GB @ 2680MHz/20Gbps |
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed