[WD12] Optimisation SQL

Le
JeAn-PhI
bonjour

j'ai 2 table (t_dossier et t_dossier_transferer) et je voudrais obtenir
la liste des dossiers non transférés

t_dossier => id_dossier (clé unique),.
t_dossier_transferer => id_dossier (clé unique),.

(je sais que ce modèle n'est pas normalisé mais ce n'est pas le but)

donc je fais :

select id_dossier,
from t_dossier
where id_dossier not in (select id_dossier from t_dossier_transferer)

donc j'aimerais savoir si il existe une autre façon plus optimiser de
faire la même chose

merci

--
Cordialement JeAn-PhI
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Jerome PAULIN
Le #18447541
JeAn-PhI a écrit :
bonjour

j'ai 2 table (t_dossier et t_dossier_transferer) et je voudrais obtenir
la liste des dossiers non transférés

t_dossier => id_dossier (clé unique),....
t_dossier_transferer => id_dossier (clé unique),....

(je sais que ce modèle n'est pas normalisé mais ce n'est pas le but)

donc je fais :

select id_dossier,...
from t_dossier
where id_dossier not in (select id_dossier from t_dossier_transferer)

donc j'aimerais savoir si il existe une autre façon plus optimiser de
faire la même chose

merci




select
id_dossier
from
t_dossier left join t_dossier_transferer on
t_dossier.id__dossier=t_dossier_transferer.id_dossier
where t_dossier_transferer is null

devrait fonctionner

gg
Jerome PAULIN
Le #18447531
JeAn-PhI a écrit :
bonjour

j'ai 2 table (t_dossier et t_dossier_transferer) et je voudrais obtenir
la liste des dossiers non transférés

t_dossier => id_dossier (clé unique),....
t_dossier_transferer => id_dossier (clé unique),....

(je sais que ce modèle n'est pas normalisé mais ce n'est pas le but)

donc je fais :

select id_dossier,...
from t_dossier
where id_dossier not in (select id_dossier from t_dossier_transferer)

donc j'aimerais savoir si il existe une autre façon plus optimiser de
faire la même chose

merci




select
t_dossier.id_dossier
from
t_dossier left join t_dossier_transferer on
t_dossier.id_dossier=t_dossier_transferer.id_dossier
where
t_dossier_transferer.id_dossier is null

devrait faire l'affaire

gg
JeAn-PhI
Le #18453221
Dans son message précédent, Jerome PAULIN a écrit :
JeAn-PhI a écrit :
bonjour

j'ai 2 table (t_dossier et t_dossier_transferer) et je voudrais obtenir la
liste des dossiers non transférés

t_dossier => id_dossier (clé unique),....
t_dossier_transferer => id_dossier (clé unique),....

(je sais que ce modèle n'est pas normalisé mais ce n'est pas le but)

donc je fais :

select id_dossier,...
from t_dossier
where id_dossier not in (select id_dossier from t_dossier_transferer)

donc j'aimerais savoir si il existe une autre façon plus optimiser de faire
la même chose

merci




select
t_dossier.id_dossier
from
t_dossier left join t_dossier_transferer on
t_dossier.id_dossier=t_dossier_transferer.id_dossier
where
t_dossier_transferer.id_dossier is null

devrait faire l'affaire

gg



ok merci

--
Cordialement JeAn-PhI
mat
Le #18474231
Jerome PAULIN wrote on 21.01.2009 :

Bonjour,

J'ai fait quelques tests pour voir si cela fonctionne aussi sous WD10
que j'utilise. En principe LEFT JOIN n'existe pas dans cette version,
et on utilise INNER JOIN en place. Le fichier INVOICE contient 8013
enregistrements. La requête suivante

" SELECT DISTINCT Invoice.IDInvoice FROM Invoice LEFT JOIN Transaction
ON ( Invoice.IDInvoice = Transaction.IDInvoice) WHERE
Transaction.IDInvoice is Null "

trouve 17 enregistrements sans contrepartie dans TRANSACTION.

Ce résultat est confirmé par une requête "NOT IN", mais elle prend
presque deux fois plus de temps.

Or, dans les tests du contraire, c'est à dire des IDInvoice qui se
trouvent dans TRANSACTION cela ne marche plus.

" SELECT DISTINCT Invoice.IDInvoice FROM Invoice LEFT JOIN Transaction
ON ( Invoice.IDInvoice = Transaction.IDInvoice) "

rend 8013 enregistrements, donc la totalité du fichier, ce qui est
faux.

Lorsqu'on remplace LEFT JOIN par INNER JOIN, la requête rend le
résultat correct de 7096 enregistrements. On pourrait dire "c'est
logique car LEFT JOIN n'estiste pas dans WD10". Or, lorsque je fais la
même chose sur la première requête, celle qui cherche les
enregistrements inexistants dans TRANSACTION, elle ne rend aucun
enregistrement.

Donc, sous WD10 le LEFT JOIN marche mais seulement lorsqu'on TESTE "is
Null". Autrement il faut utiliser INNER JOIN, mais elle prend le même
temps que la requête "IN". D'autre part avec INNER JOIN tester "is
Null" ne marche pas. Y a-t-il une autre solution?

Les deux requêtes "NOT IN" et "IN" fonctionnent correctement.


Mat
Publicité
Poster une réponse
Anonyme