#1 Wed 23 January 2008 18:27
- laureN
- Participant actif
- Date d'inscription: 23 Nov 2007
- Messages: 105
Pb de requête
Bonjour,
Je fait des tests pour vérifier le SQL utilisé dans MI, et j'aimerais savoir comment il est possible de stocker le resultat d'une requête dans une variable utilisable dans une autre requête? en effet pour pas mal de mes requêtes je n'ai pas d'erreur d'sql mais le résultat retourné est faux, je fais pour l'instant des tests sur de petites tables faciles à vérifier mais sur les grosses ça ne sera pas facile....
Regardez la pièce attachée, sur les tables fournies par MI 8.5, si j'utilise fde06 et fre06 pour avoir en retour les "départements dont le revenu est minimun pour un ensemble de régions donné",j'obtient une réponse fausse......
Si quelqu'un peux jeter un oeil, Merci d'avance
Hors ligne
#2 Wed 23 January 2008 20:47
- Maurice
- Membre
- Lieu: Montpellier
- Date d'inscription: 5 Sep 2005
- Messages: 5331
Re: Pb de requête
...pour avoir les "départements dont le revenu est minimum pour un ensemble de régions donné", j'obtiens une réponse fausse....
Bonjour
C'est parce que la requête est fausse (par rapport au résultat souhaité) Il faut une sous-sélection
Une première hypothèse
Select fde06.Nom, fde06.Menages, fre06.Nom from fde06, fre06 where fde06.CodeReg= fre06.Code And fde06.Menages = any (select Min(Menages) from fde06 where CodeReg in ("11","24"))
Seconde solution, puisqu'il y a une colonne fde06.CodeReg
Select Nom, Menages, CodeReg from fde06 where Menages = any (select Min(Menages) from fde06 where CodeReg in ("11","24"))
Hors ligne
#3 Wed 23 January 2008 23:00
- laureN
- Participant actif
- Date d'inscription: 23 Nov 2007
- Messages: 105
Re: Pb de requête
bonjour,
j'ai testé les requêtes proposées (j'avais déjà tenté ces options) et c'est faux cela ne sort que le département ayant la plus petite valeur de ménage de l'ensemble des deux régions (soit l'indre) et non pas les départements ayant les valeurs de ménages les plus faibles de chacune des valeurs c'est à dire l'indre (reg24) et le val d'oise (reg 11). c'est pourquoi je pense à la programmation....
Si quelqu'un trouve........
Merci
Hors ligne
#4 Wed 23 January 2008 23:53
- Maurice
- Membre
- Lieu: Montpellier
- Date d'inscription: 5 Sep 2005
- Messages: 5331
Re: Pb de requête
Donc c'est que l'énoncé n'est pas:
...pour avoir les "départements dont le revenu est minimum pour un ensemble de régions donné"...
mais plutôt:
...pour avoir les "départements dont le revenu est minimum pour chacune des régions d'un ensemble de régions donné..."
Alors, en rajoutant un Group By, on devrait arriver au résultat avec:
Select fde06.Nom, Min(fde06.Menages), fre06.Nom from fde06, fre06 where fde06.CodeReg= fre06.Code And fde06.Nom = any (select Nom from fde06 where CodeReg in ("11","24")) group by fde06.Nom
nb: la table obtenue est non graphique, à cause du Group By
Hors ligne
#5 Thu 24 January 2008 10:01
- laureN
- Participant actif
- Date d'inscription: 23 Nov 2007
- Messages: 105
Re: Pb de requête
Bonjour,
Merci pour ta réponse mais cela ne marche pas j'ai mis une capture d'écran avec la requete et la table de résultante....
C'est pas si simple
PS: j'ai testé sous MySql une requête qui marche mais elle n'est pas rigoureuse niveau SQL mais MysQL l'accepte et retourne le bon résultat, impossible de la transcrire sur MI ce qui niveau sql est logique
SELECT Fre06.nom, min(Fde06.menages), Fde06.nom from Fre06,Fde06 where Fre06.code = Fde06.codereg and Fde06.menages=(select min(Fde06.menages) from Fde06 where Fde06.codereg=Fre06.code) and Fde06.codereg in ("11","13") group by Fde06.codereg
Dernière modification par laureN (Thu 24 January 2008 10:02)
Hors ligne
#6 Thu 24 January 2008 10:30
- Maurice
- Membre
- Lieu: Montpellier
- Date d'inscription: 5 Sep 2005
- Messages: 5331
Re: Pb de requête
Essaie juste avec la dernière requête que j'ai posté en changeant group by fde06.Nom pargroup by fde06.CodeReg
Hors ligne
#7 Thu 24 January 2008 10:46
- laureN
- Participant actif
- Date d'inscription: 23 Nov 2007
- Messages: 105
Re: Pb de requête
Alors si on fait ce changement il sort des résutats faux, j'ai mis en pièce attachée le résultat, en fait j'ai le bon nom des région, j'ai bien la valeur du champ ménage minimum de chaque région mais le nom des départements est faux, l'intégrité des données n'est pas respectée, la valeur du champs ménage ne correspond pas à son nom de département dans la table résultante.....
Heureusement que ces tables sont petites et qu'une erreur est vite vu ....... ce qui est inquiétant c'est que la logique SQL est là mais MI l'interprète mal et surtout sort des résultats faux ça serait mieux qu'il donne une erreur, j'ai peur que certains ai utilisé ce genre de requêtes sans voir l'erreur.....c'est vrai que sur de grosses tables c'est pas évident......
Dernière modification par laureN (Thu 24 January 2008 10:59)
Hors ligne
#8 Thu 24 January 2008 11:51
- Maurice
- Membre
- Lieu: Montpellier
- Date d'inscription: 5 Sep 2005
- Messages: 5331
Re: Pb de requête
Désolé, j'avais du mal à juger n'ayant pas les tables fde06 et fre06 que tu utilises
Mais effectivement cela va être coton à obtenir puisque la fonction Min() s'applique à toute une colonne et que pour avoir le résultat souhaité il faudrait l'appliquer successivement à un sous ensemble puis à l'autre...
Etant en grève ce jour ()...je vais tâcher de réfléchir à une requête unique (ou s'il le faut, décomposer en plusieurs requêtes)
Hors ligne
#9 Thu 24 January 2008 12:03
- laureN
- Participant actif
- Date d'inscription: 23 Nov 2007
- Messages: 105
Re: Pb de requête
Merci beaucoup, ui c'est coton c'est pour ça que je pensais à de la programmation comme on le fait entre le php et mySQL par exemple mais je ne sais pas comment faire avec le MapBasic, le problème c'est que Map info n'a pas la clause Having .....
Decomposer en deux implique de faire une première requête qui prendra les département d'une région donnée, enfaire une table et puis dedans prendre le min par une autre requete, mais c'est impensable d'avoir autant de table que de régions.....c'est pas du tout efficasse
Merci de ton aide et si un autre internaute s'interesse à la question merci de sa future collaboration
PS: je vais contacter le service technique de MI si personne ne trouve
Sous Mysql voici une requête propre qui marche bien mais impossible à passer sous MI qui n'accepte qu'une sous requête
SELECT Fre06.nom, Fde06.menages, Fde06.nom
FROM Fre06, Fde06
WHERE Fre06.code = Fde06.codereg
AND (
Fde06.menages = (
SELECT min( Fde06.menages )
FROM Fde06
WHERE Fde06.codereg =11 )
OR Fde06.menages = (
SELECT min( Fde06.menages )
FROM Fde06
WHERE Fde06.codereg =13 )
)
Il faudrait pouvoir stocker sous MI.....
Dernière modification par laureN (Thu 24 January 2008 12:55)
Hors ligne
#10 Thu 24 January 2008 13:31
- Maurice
- Membre
- Lieu: Montpellier
- Date d'inscription: 5 Sep 2005
- Messages: 5331
Re: Pb de requête
Pour l'instant en trois étapes, la troisième pouvant être réutilisée en changeant seulement le code des régions:
Select Min(Menages) "minimum", NomReg,CodeReg from fde06 group by NomReg into minimas
Select Nom,Menages,NomReg,CodeReg from fde06 where Menages=any (select minimum from minimas) into result1
Select * from result1 where CodeReg in ("11","24") into FINAL
Je tâcherai de réduire après la manif...
Pardon, c'était évident !! En deux:
Select Min(Menages) "minimum", NomReg,CodeReg from fde06 group by NomReg into minimas
Select Nom,Menages,NomReg from fde06 where Menages=any (select minimum from minimas) and CodeReg in ("11","24") into resultat
... pas mieux
Hors ligne
#11 Thu 24 January 2008 13:46
- laureN
- Participant actif
- Date d'inscription: 23 Nov 2007
- Messages: 105
Re: Pb de requête
Merci beaucoup et bonne manif à toi. Je vais tester , on verra bien si d'autres trouvent mieux...
J'ai testé ça marche en rajoutant la condition de jointure entre les deux tables fde06 et fre06 pour jouer avec le nom des régions mais la méthode est là.
C'est donc irréalisable en une seule requete mais si l'assistance technique de MI me donne une solution je la mettrais sur le forum
Dernière modification par laureN (Thu 24 January 2008 15:30)
Hors ligne