Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2840 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°2126055
donny3
Posté le 12-02-2012 à 12:17:09  profilanswer
 

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
 
 
 
 
 

mood
Publicité
Posté le 12-02-2012 à 12:17:09  profilanswer
 

n°2126093
Sve@r
Posté le 13-02-2012 à 01:16:20  profilanswer
 

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

n°2126111
Oliiii
Posté le 13-02-2012 à 09:15:31  profilanswer
 

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

n°2126508
MEI
|DarthPingoo(tm)|
Posté le 14-02-2012 à 16:55:58  profilanswer
 

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 |

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

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

 

Sujets relatifs
Requête PL/SQLMacro Ecrire Dossier et sous dossiers
[MySQL] Besoin d'aide pour une requete UPDATE[MySQL] Problème d'exécution d'une requête SQL
Perl: afficher le résultat d'une requête sqlPerformances Curseur / Complexité requête SQL
Gestion d'une Requête SQL grâce à JCBDrecherche logiciel libre pour formulaire, retour requête
Requête SQLQue renvoi une requête SQL en C++ ?
Plus de sujets relatifs à : meilleur façon d'écrire une requête sql


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR