|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité de passage
![]() Inscription : mars 2008 Messages : 23 ![]() |
Bonjour a tous,
Je me permets d écrire car je n ai pas trouvé de problème similaire au miens ... Je m explique : J ai deux tables dans une base " assez bien utilisé par plusieurs utilisateurs " j ai une requete delete from avec une condition not in ... cependant de temps en temps sans expliquation j ai ma requête qui " ne va pas bien consulter la deuxième dépendante du not in et va donc me supprimer des donnes que je ne voudrais pas. Exemple : delete from tablea where c_client not in (select c_client from tableb) Parfois cette requête va supprimer des éléments de tablea qui sont bien dans tableb La question est donc, pourquoi ... est ce que parce que tableb est occupé au moment de la requête ? Et surtout il y a t il un moyen d empêcher cela sans toucher a la requête ? Paramètre dans sql serveur ? Merci de votre aide |
|
|
00
|
|
|
#2 | ||||||||||||
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 959 ![]() |
A priori je pense que vous connaissez mal le langage SQL...
En effet, avec NOT IN, si la sous requête retourne des NULL, alors le prédicat vaut faux. DEMONSTRATION... Code :
Code :
Code :
--> ce qui est le résultat que vous attendiez certainement... Code :
Code :
Code :
Bref, apprenez le SQL... Mon site web, comme mon bouquin est là pour vous aider ! A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/ Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp. Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * * |
||||||||||||
|
10
|
|
|
#3 |
|
Invité de passage
![]() Inscription : mars 2008 Messages : 23 ![]() |
Bonjour, et merci pour ton aide.
Je ne pense pas être une experte, mais une utilisatrice normalement expérimentée. J'ai donc mal du m'exprimer pour exposer mon problème. Voici donc la rêquete en question Code :
DELETE FROM stock_reserve WHERE date_liv<'20111020' AND stock_reserve.n_cde NOT IN (SELECT ent_cde.n_cde FROM ent_cde WHERE stock_reserve.n_cde=ent_cde.n_cde AND c_etat_cde='C') AND c_trf<>'O' Code :
SELECT ent_cde.n_cde FROM ent_cde WHERE stock_reserve.n_cde=ent_cde.n_cde AND c_etat_cde='C' est il donc possible que ma premiere requete n'arrive pas à consulter de temps en temps ent_cde et donc .. va supprimer des éléments de stock_reserve sans vraiment attendre la fin du résultat de ent_cde Merci encore de votre aide. |
|
|
00
|
|
|
#4 | |
|
Membre Expert
![]() Inscription : août 2009 Messages : 779 ![]() |
Citation:
|
|
|
|
00
|
|
|
#5 |
|
Invité de passage
![]() Inscription : mars 2008 Messages : 23 ![]() |
Hummm ... merci bien de ta réponse ...
Certain ? qu'aucun paramètre serveur pourrait mettre un délai timeout ?! et que du coups il n'arrive pas à lire dans un délai " normal " execute la requete sans lire la table ent_cde ... ?! Le pire étant que ce n'est pas la seule requete avec un not in qui me fait ce genre de problème ... ='( ce qui n'est pas logique étant qu'il n'y a pas de répétition bien définie ... cela arrive de temps en temps parfois 1 fois par mois, parfois rien durant 2 mois, parfois 4 fois sur un mois ... |
|
|
00
|
|
|
#6 |
|
Membre Expert
![]() Inscription : août 2009 Messages : 779 ![]() |
S'il y a un timeout, cela déclenchera une exception qui portera sur l'intégralité de la requête, et donc aucune suppression n'aura été effectuée.
|
|
|
00
|
|
|
#7 |
|
Invité de passage
![]() Inscription : mars 2008 Messages : 23 ![]() |
Hummm ... ok !
Bon quel serait le moyen pour " vérifier " ce qu'il se passe exactement ? Autre que lancer manuellement un profiler ... ? |
|
|
00
|
|
|
#8 |
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 959 ![]() |
Si votre sous requête :
Code :
SELECT ent_cde.n_cde FROM ent_cde WHERE stock_reserve.n_cde=ent_cde.n_cde AND c_etat_cde='C' Alors NOT IN est faux, donc tout est traité. Vérifiez que vous n'avez pas de temps à autre un ent_cde.n_cde NULL ! Remplacez le NOT IN pas un NOT EXISTS corrélé. A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/ Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp. Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * * |
|
01
|
|
|
#9 |
|
Invité de passage
![]() Inscription : mars 2008 Messages : 23 ![]() |
Hum Hum ...
Je ne peux modifier la requete hélas ... Il n'est normalement pas pensable d'avoir une valeur null dans n_cde ... mais pouvons nous avec un profiler automatique qui sauvegarde jour / jour avec un résultat des requetes ? enfin ... un moyen tout simplement de pister l'erreur ?! Merci en tout cas de votre aide. |
|
|
00
|
|
|
#10 | |
|
Membre Expert
![]() Inscription : août 2009 Messages : 779 ![]() |
Citation:
Or là, le problème c'est qu'il y a des lignes supprimées qui ne devraient pas l'être. Edit : de toute façon, NULL n'est pas une valeur qui peut être retournée par cette requête ; elle sélectionne ent_cde.n_cde et il y a une condition d'égalité sur cette valeur. |
|
|
|
00
|
|
|
#11 | |
|
Membre expérimenté
![]() |
Citation:
|
|
|
|
00
|
|
|
#12 |
|
Membre Expert
![]() Inscription : août 2009 Messages : 779 ![]() |
|
|
|
00
|
|
|
#13 | |
|
Invité de passage
![]() Inscription : mars 2008 Messages : 23 ![]() |
Merci de vos réponses, j'aimerai savoir cependant, si ma précédente question est possible :
Citation:
|
|
|
|
00
|
|
|
#14 |
|
Membre Expert
![]() Inscription : août 2009 Messages : 779 ![]() |
Vous pourriez mettre temporairement en place une insertion dans une table de log, avant et après votre requête ... Cela peut s'avérer consommateur (de temps CPU et de mémoire), cela dit.
Vous devriez surtout tracer les modifications sur la table stock_reserve, vu la requête le seul moyen de générer votre problème c'est qu'elle soit modifiée après le DELETE, provoquant une incohérence des données. |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com