sql requete aide please

sql requete aide please - SQL/NoSQL - Programmation

Marsh Posté le 27-11-2003 à 16:34:30    

j'ai deux tables :
A et B
 
A
ID_A clé primaire
LIB_A
 
B
ID_1 clé primaire
ID_2 clé primaire
VAL
ID_A
 
Ce qu'il me faut c'est trouver pour chacune des combinaisons ID_1,ID_2 la valeur minimum de VAL et le LIB de du ID_A associé.
 
la requete suivante fait le resultat escompté sauf que je n'ai pas le Lib_A
 
select B.ID_1, B.ID_2, min(B.VAL)
from B
GROUP BY B.ID_1,B.ID_2
;
 
Le problème c'est que je n'ai pas le libellé meme si le resultat est parfait
 
select B.ID_1, B.ID_2, min(B.VAL),A.LIB_A
from B,A
Where B.ID_A=A.ID_A
GROUP BY B.ID_1,B.ID_2,A.LIB_A
;
 
le problème c'est que je n'est pas besoin de  A.LIB_A dans le groupe by comment faire sans.
 
il me faut les enregistrement de la première requete avec les champs B.ID_1,B.ID_2 et A.LIB_A
 
A l'aide
je sais ce n'est pas tres compréhensible mais ca ne doit pas être dur!!

Reply

Marsh Posté le 27-11-2003 à 16:34:30   

Reply

Marsh Posté le 27-11-2003 à 16:50:41    

?????????????????????????????????????????????????????????????????????????????
?????????????????????????????????????????????????????????????????????????????
?????????????????????????????????????????????????????????????????????????????
?????????????????????????????????????????????????????????????????????????????
?????????????????????????????????????????????????????????????????????????????
?????????????????????????????????????????????????????????????????????????????
?????????????????????????????????????????????????????????????????????????????
?????????????????????????????????????????????????????????????????????????????
?????????????????????????????????????????????????????????????????????????????
?????????????????????????????????????????????????????????????????????????????
?????????????????????????????????????????????????????????????????????????????
?????????????????????????????????????????????????????????????????????????????
?????????????????????????????????????????????????????????????????????????????
?????????????????????????????????????????????????????????????????????????????
?????????????????????????????????????????????????????????????????????????????
?????????????????????????????????????????????????????????????????????????????
?????????????????????????????????????????????????????????????????????????????
Quelle Base
?????????????????????????????????????????????????????????????????????????????
?????????????????????????????????????????????????????????????????????????????
?????????????????????????????????????????????????????????????????????????????
?????????????????????????????????????????????????????????????????????????????
?????????????????????????????????????????????????????????????????????????????
?????????????????????????????????????????????????????????????????????????????
?????????????????????????????????????????????????????????????????????????????
?????????????????????????????????????????????????????????????????????????????
?????????????????????????????????????????????????????????????????????????????
?????????????????????????????????????????????????????????????????????????????
?????????????????????????????????????????????????????????????????????????????
?????????????????????????????????????????????????????????????????????????????
?????????????????????????????????????????????????????????????????????????????
?????????????????????????????????????????????????????????????????????????????
?????????????????????????????????????????????????????????????????????????????
?????????????????????????????????????????????????????????????????????????????
?????????????????????????????????????????????????????????????????????????????
?????????????????????????????????????????????????????????????????????????????
?????????????????????????????????????????????????????????????????????????????
?????????????????????????????????????????????????????????????????????????????
?????????????????????????????????????????????????????????????????????????????
?????????????????????????????????????????????????????????????????????????????
?????????????????????????????????????????????????????????????????????????????
?????????????????????????????????????????????????????????????????????????????
?????????????????????????????????????????????????????????????????????????????
?????????????????????????????????????????????????????????????????????????????
?????????????????????????????????????????????????????????????????????????????
?????????????????????????????????????????????????????????????????????????????


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 27-11-2003 à 17:04:28    

ca va solutionner mon probleme une reponse comme ca

Reply

Marsh Posté le 27-11-2003 à 17:14:37    

Si tu me dis ORACLE, j'ai une solution toute simple !
Si tu me dis MySql 3.x, c'est pas possible en une seule requête.
 
Je vais pas me faire chier à pondre une requête que tu ne pourras pas utiliser !
 
En GROS :
 
Merci de poser des questions en précisant le contexte !


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 27-11-2003 à 17:24:13    

ok c'est du oracle 8.1.x
prg php 4.2.x drivers jdbc

Reply

Marsh Posté le 27-11-2003 à 17:40:02    

ID_1 clé primaire
ID_2 clé primaire
 
 
et tu veux le minimum pour chacun des couples ID_1, ID_2 ?
 
Etant donné que un couple ID_1, ID_2 est une clé primaire, t'auras toujours qu'un enregistrement associé à ce couple donc le minimum est pas difficile à trouver, c'est LA valeur pour ce couple.
 
Ou alors tu t'es trompé dans ta description des champs

Reply

Marsh Posté le 27-11-2003 à 17:57:10    

c'est vrai que c'est un peu plus compliqué que ca  
mais ID_A n'est pas clé primaire et donc par conséquant on peut avoir ca :
 
table B
 
ID_1  | ID_2  | VAL  | ID_A  | Autres champs
------|-------|------|-------|---------
  1   |   2   |  34  |  12   |
------|-------|------|-------|---------
  1   |   3   |  12  |   5   |
------|-------|------|-------|---------
  2   |   1   |  1   |   4   |
------|-------|------|-------|---------
  2   |   2   |   15 |   5   |
 
table A
 
id_a  | lib_a |
------|-------|
12    | balba |
5     | labao |
4     |  abj  |
 
réponse à la requete recherchée :
 
id_1    id_2   lib_a
-----|-------|--------
1       3      labao
2       1      abj

Reply

Marsh Posté le 27-11-2003 à 18:28:22    

select
 B.ID_1,
 B.ID_2,
 B.VAL,
 A.LIB_A
from
 B,A
Where
 B.ID_A=A.ID_A
 and TO_CHAR( B.ID_1 ) || '_' || TO_CHAR( B1.ID_1 ) IN
 (
  select
   TO_CHAR( B.ID_1 ) || '_' || TO_CHAR( B1.ID_1 ),
   min(B.VAL)
  from
   B
  GROUP BY
  TO_CHAR( B.ID_1 ) || '_' || TO_CHAR( B1.ID_1 )
 )
;


 
Impossible en MySql 3.X !
Mais possible avec Oracle :D


Message édité par Mara's dad le 27-11-2003 à 18:29:54

---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 27-11-2003 à 19:07:44    

je vais tester ca demain, mais si ca marche j'avoue que t'y connais drolement :)

Reply

Marsh Posté le 28-11-2003 à 10:34:45    

ca ne marche pas :(
parce que lorsque IN est utilisé on ne peut pas faire un select sur plusieurs champs!
mais c'est bon j'ai trouvé :)
 
select
 B.ID_1,
 B.ID_2,
 B.VAL,
 A.LIB_A
from
 B,A
Where
 B.ID_A=A.ID_A
and B.VAL = (select min(B1.val) from B1 (instance de B)
where B1.id_1=B.id and B1.id_2=B.id_2)
;
 
et ca marche :)

Reply

Marsh Posté le 28-11-2003 à 10:34:45   

Reply

Marsh Posté le 28-11-2003 à 11:25:28    

Bon, y'a bien des bugs dans ma requête, mais y'a des problèmes :
Tu cherche le mini de VAL, mais pour B.ID_1, pas pour le couple ID_1 et ID_2. Sinon çà ne vaux rien dire puisque ID_1 + ID_2 est la cléf primaire... Donc pour chaque couple t'as qu'une seule valeur de VAL...
 
Ta requête :

select  
B.ID_1,  
B.ID_2,  
B.VAL,  
A.LIB_A  
from  
B,A  
Where  
B.ID_A=A.ID_A  
and B.VAL = (select min(B1.val) from B1 (instance de B)  
where B1.id_1=B.id and B1.id_2=B.id_2)  
;


 
Ne marche pas !
Corrigée comme çà :  

select
 B.ID_1,
 B.ID_2,
 B.VAL,
 A.LIB_A
from
 B,A
Where
 B.ID_A=A.ID_A
and B.VAL = (select min(B1.val) from B B1
where B1.id_1=B.id_1 and B1.id_2=B.id_2);


Le résultat est :

ID_1 ID_2 VAL LIB_A
1 2 34 balba
1 3 12 labao
2 1 1 abj
2 2 15 labao


 
En fait pour chaque ID_1, tu cherche le ID_2 qui a le val le plus petit.
 
En fait ce que tu veux c'est :

select
 B.ID_1,
 B.ID_2,
 B.VAL,
 A.LIB_A
from
 B,
 A
Where
 B.ID_A=A.ID_A
 and B.VAL =
 (
  select
   min(B1.val)
  from
   B B1
  where
   B1.id_1=B.id_1
 );


 
Qui donne bien :

ID_1 ID_2 VAL LIB_A
1 3 12 labao
2 1 1 abj


 
A+


---------------
Laissez l'Etat dans les toilettes où vous l'avez trouvé.
Reply

Marsh Posté le 28-11-2003 à 11:43:39    

oui c'est vrai qu'il ya d'autre champs.
effectivement dans ma requête il y avait un _1 d'oublié :)
Mais c'est bon c'est bien ce que je recherche.
 
encore merci

Reply

Sujets relatifs:

Leave a Replay

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