Requete min sur une liste

Requete min sur une liste - SQL/NoSQL - Programmation

Marsh Posté le 18-12-2006 à 09:38:49    

Bonjour à tous,  
 
Je pense que ma question est assez triviale mais je ne connais pas particulierement SQL (j'utilise Access), donc je viens la soumettre ici:
 
J'ai une table de la forme ID(Cle primaire)/A/B/C/D/E
Je souhaite à partir d'une requete obtenir pour une valeur de E donnée, la suivante dans la table, c'est à dire l'ID de la valeur suivante ayant pour valeur E.
 
J'ai essayé un truc comme ca :
 
SELECT Table.ID, Val(Table!D) AS D1, Table.E, Table_1.ID, Table_1.E
FROM Table, Table AS Table_1
GROUP BY Table.ID, Val(Table!D), Table.MID, Table_1.ID, Table_1.E
HAVING (((Table_1.ID)>[Table]![ID]) AND ((Table_1.E)=[Table]![E]))
ORDER BY Table.ID;
 
La requete n'est pas bonne car (Table_1.ID)>[Table]![ID]) me renvoie l'ensemble des élements qui ont une ID plus grande alors que je voudrais seulement le suivant. J'ai essaye un Min() mais ca ne marche pas.
 
Merci d'avance,
Greg.
 
:hello:

Reply

Marsh Posté le 18-12-2006 à 09:38:49   

Reply

Marsh Posté le 18-12-2006 à 10:56:19    

Citation :

Je souhaite à partir d'une requete obtenir pour une valeur de E donnée, la suivante dans la table, c'est à dire l'ID de la valeur suivante ayant pour valeur E.


 
Cette phrase ne veut rien dire.
Tu veux quoi au juste ?
Exemples.
 
Parceque là en fait, c'est illogique comme question ;)

Reply

Marsh Posté le 18-12-2006 à 11:47:50    

Gregouf > Ca signifie qu'à l'instance ID X j'ai une valeur Y dans le champ E.   Je veux que ma requete renvoie la valeur X' correspondant à la prochaine iteration de la valeur Y dans le champ E.  
C'est plus clair ??

Reply

Marsh Posté le 18-12-2006 à 12:14:29    

J'imagine que c'est ça, mais je voudrais être sûr ;)
 
En tout cas, ça va se solder par une sous-requete avec un MIN()

Reply

Marsh Posté le 18-12-2006 à 15:07:28    

Oui je suppose :D. Le truc c'est que la table de départ fait 2500000, donc faut reduire ça de maniere intelligente (donc pas ce que j'ai fait pour l'instant :D). Car si je lui demande de generer dans une premiere table seulement la partie (((Table_1.ID)>[Table]![ID]) AND ((Table_1.E)=[Table]![E])) le bougre à du mal, faut dire que je fais le traitement sur un portable et je n'ai que ca sous la main.
 
Donc l'idée de base que tu proposes c'est de faire la requete que j'ai indiqué en 1. puis passer par un Min direct en 2.
avec un truc du style ID1 et Min(ID2) ??
 
Merci
:hello:

Reply

Marsh Posté le 18-12-2006 à 15:39:39    

bon, alors :
 
ID et valeur de E pour l'ID=25 :
 


select t1.id, t1.e
from table t1
where t1.id = 25


 
Maintenant, liste de tous les ID suppérieurs où E est égale à la même valeur que celui de l'ID=25 :
 


select t1.id old_id, t1.e old_e, t2.new_id, t2.new_e
from table t1 inner join table t2 on t2.e = t1.id and t2.id > t1.id
where t1.id = 25


 
Maintenant, je veux parmis les ID supérieurs, le plus petit :
 


select t1.id old_id, t1.e old_e, t2.new_id, t2.new_e
from table t1 inner join table t2 on t2.e = t1.id and t2.id > t1.id
where t2.id =
(
  select min(t3.id)
  from table t3
  where t3.id > t1.id
  and t3.e = t1.e
)
and t1.id = 25


 
Suppression des filtres inutiles sur t2, puisqu'on filtre déjà avec t3 sur sa clé primaire id (on peut donc pas faire mieux) :
 


select t1.id old_id, t1.e old_e, t2.new_id, t2.new_e
from table t1 inner join table t2
where t2.id =
(
  select min(t3.id)
  from table t3
  where t3.id > t1.id
  and t3.e = t1.e
)
and t1.id = 25


 
Et voilà :)


Message édité par MagicBuzz le 18-12-2006 à 15:45:58
Reply

Marsh Posté le 19-12-2006 à 06:24:56    

Merci pour ta reponse complete, j'ai compris la connerie que j'avais faite et maintenant ca marche.
:hello:


Message édité par gregouf le 19-12-2006 à 07:00:15
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed