#1 Thu 15 September 2005 11:56
- Marc
- Membre
- Lieu: Lorient
- Date d'inscription: 24 Jun 2005
- Messages: 988
Requete trop longue !
Bonjour,
J'essaye de faire passer cette requete dans Mapinfo, mais au bout d'une heure j'ai estimé que c'etait un peu trop long.
une idée pour optimiser ça ?
"select * from matable where num_c not in (select num_c from matable where annee < 2005)"
Marc
Marc ROSSI
Hors ligne
#2 Thu 15 September 2005 14:28
- Maurice
- Membre
- Lieu: Montpellier
- Date d'inscription: 5 Sep 2005
- Messages: 5331
Re: Requete trop longue !
Bonjour,
Ca parait effectivement un peu compliqué et il serait plus simple et équivalent de demander:
select * from matable where annee >= 2005
ou ''2005'' si annee est en caractère
Une sous sélection (nb: qui s'exécute en premier) n'a d'intérêt que si elle porte sur une autre table
Cependant je ne vois pas pourquoi il n'y a aucun résutat après 1h: matable est-elle si 'lourde' ?
Bon courage
Hors ligne
#3 Thu 15 September 2005 18:15
- jplartigau
- Juste Inscrit !
- Date d'inscription: 13 Sep 2005
- Messages: 2
Re: Requete trop longue !
Bonjour a tous
Petite info pour la lecture generale de mes messages,
je ne mets plus d'accent sur mes catracteres car je lis de caracteres asiatiques ...
Pour reprendre le probleme j'ai surtout l'impression que Mapinfo a beaucoup de mal a effectuer une requete avec la condition not
Le plus simple et de ne pas faire le not puis ensuite d'inverser la selection (cela existe depuis la version 6.5 ou 7.0 je ne sais plus trop). Cela marche avec juste l'inconvenient est de ne pas pouvoir nommer clairement le resultat de cette derniere requete (inversion de selection).
Voila bonne soiree
Hors ligne
#4 Thu 15 September 2005 23:01
- Marc
- Membre
- Lieu: Lorient
- Date d'inscription: 24 Jun 2005
- Messages: 988
Re: Requete trop longue !
Bonsoir,
En fait la table est effectivement assez lourde.
3 champs: num_c / anneemois / num_f, mais beaucoup d'enregistrements
je cherchai a recuperer tous les client qui ont fait une commande en 2005, mais qui n'ont pas fait de commande avant 2005 (les nouveaux client quoi) d'ou:
select * from matable where anneemois > 200412 and num_c not in (select num_c from matable where anneemois < 200501)
Mais effectivement j'ai abandonné et finalement j'ai fait ma requete dans BO avant d'exporter le resultat dans Mapinfo
Merci tout de meme pour votre aide
marc
Marc ROSSI
Hors ligne
#5 Fri 16 September 2005 14:27
- William Sol
- Juste Inscrit !
- Date d'inscription: 5 Sep 2005
- Messages: 6
- Site web
Re: Requete trop longue !
T'aurais pas oublie d'indexer les champs anneemois et num_c
Hors ligne
#6 Mon 19 September 2005 13:58
- Marc
- Membre
- Lieu: Lorient
- Date d'inscription: 24 Jun 2005
- Messages: 988
Re: Requete trop longue !
T'aurais pas oublie d'indexer les champs anneemois et num_c
Non, non, c'est la premiere chose que j'ai faites
Marc ROSSI
Hors ligne
#7 Mon 19 September 2005 21:32
- Damien BEAUSEIGNEUR
- Participant assidu
- Lieu: meyzieu
- Date d'inscription: 5 Sep 2005
- Messages: 425
Re: Requete trop longue !
La lenteur vient du in il doit reproduire chaque enregistrement contenu dans la sélection de la parenthèse pour valider le résultat.
càd m test de validation m étant le nombre de résultat contenu dans la sélection du in pour valider un non
pour valider un in sans not il en faut la moitié en moyenne
Sans compter les doublons prévisible dans le select et autre cela peut durer longtemps.
Une solution au probleme serai de grouper les résultats par num_c, ensuite de récupérer le minimum de la colonne anneemois pour ce groupement, d'enregistrer ce résultat sous forme de table.
Et d'utiliser cette table créée pour obtenir le résultat voulu
select num_c, min(anneemois) as minimum from matable group by num_c into tabletemp
select * from matable, tabletemp where matable.num_c = tabletemp.num_c and tabletemp.minimum >= 200501
Nb cette requete donne toutes les enregistrement des nouveaux clients avec éventuellement des doublons, si un client peut avoir 2 enregistrements ou plus la même année.
Pour récupérer seulement la liste des clients utilisez:
select * from tabletemp where minimum >= 200501
Hors ligne