SELECT et COUNT avec postgres avec INTERSECTION

SELECT et COUNT avec postgres avec INTERSECTION - SQL/NoSQL - Programmation

Marsh Posté le 21-06-2011 à 23:27:33    

je suis entrain de mettre au point une requête SQL mais j'ai un problème pour compter les éléments d'une intersection :

 
Code :
  1. (SELECT (id) FROM ifepsa.etudiant , ifepsa.resultats WHERE
  2. sexe = 1 AND id=id_etudiant AND semestre='S1' AND niveau='L1' AND annee='2007-2008')
  3. INTERSECT
  4. (SELECT (id) FROM ifepsa.etudiant , ifepsa.resultats WHERE
  5. sexe = 1 AND id=id_etudiant AND semestre='S1' AND niveau='L1' AND annee='2006-2007')

 

Cette requête fonctionne mais je n'arrive pas à l'appliquer avec un COUNT, mais es possible ?

 

La requête sera lancée d'un programme java, donc au pire je renvoie la liste des id et la compte dans mon programme mais je trouve cela beaucoup moins propre.

 

Je suis sur PostGresSQL.

 

Si vous avez quelques avis ou conseils, je suis preneur ;).

 

En vous remerciant :jap:


Message édité par grundoc le 23-06-2011 à 14:19:48

---------------
Mes vente
Reply

Marsh Posté le 21-06-2011 à 23:27:33   

Reply

Marsh Posté le 24-06-2011 à 16:53:44    

j'ai finalement contourné le problème en comptant le nombre de résultats de mon resultset dans le code java.
 
Si quelqu'un une autre solution ça m'intéresse. ;)


---------------
Mes vente
Reply

Marsh Posté le 24-06-2011 à 17:07:44    

Un truc de ce genre devrait fonctionner :

Code :
  1. SELECT count(id) FROM
  2. ((SELECT (id) FROM ifepsa.etudiant , ifepsa.resultats WHERE
  3. sexe = 1 AND id=id_etudiant AND semestre='S1' AND niveau='L1' AND annee='2007-2008')
  4. INTERSECT
  5. (SELECT (id) FROM ifepsa.etudiant , ifepsa.resultats WHERE
  6. sexe = 1 AND id=id_etudiant AND semestre='S1' AND niveau='L1' AND annee='2006-2007'))



---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 24-06-2011 à 17:11:22    

...et après réelle lecture de ta requête, il y a nettement plus simple, a priori:

 
Code :
  1. SELECT count(id)
  2. FROM ifepsa.etudiant etd
  3.     JOIN ifepsa.resultats res1 ON (res1.id_etudiant = etd.id AND sexe = 1 AND semestre='S1' AND niveau='L1' AND annee='2007-2008')
  4.     JOIN ifepsa.resultats res2 ON (res2.id_etudiant = etd.id AND sexe = 1 AND semestre='S1' AND niveau='L1' AND annee='2006-2007')


Message édité par skeye le 24-06-2011 à 17:12:25

---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 24-06-2011 à 17:16:07    

PostGre me renvoie l'erreur suivant :
 
ERREUR:  la sous-requête du FROM doit avoir un alias
LINE 24: ((SELECT T(id) FROM ifepsa.etudiant, ifepsa.resultats WHERE
         ^
HINT:  Par exemple, FROM (SELECT...) [AS] quelquechose.
 
Il semble que FROM doit se référer à autre chose que la recherche, peut être qu'en donnant des noms à mes deux SELECT cela pourrait marché.


---------------
Mes vente
Reply

Marsh Posté le 24-06-2011 à 17:18:38    

Oui, ça dépend du SGBD, ça...mais ma deuxième solution doit passer un peu partout.:D


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 24-06-2011 à 17:28:58    

Le deuxième ne marche pas non plus.
 
En faite, je doit compter les id des étudiant (table étudiant) si il sont présent en L1 une année et en L1 l'année suivante.
Leur id est présent dans la table etudiant, et id_etudiant de la table resultats réfère à un id de la table etudiant, je vous montre le code de la génération de ces deux tables :
 

Code :
  1. CREATE TABLE ifepsa.etudiant(
  2. id integer,
  3. sexe integer,
  4. ville_lycee CHAR (60),
  5. dpt_lycee integer,
  6. serie_bac CHAR (35),
  7. pcs_pere CHAR (2),
  8. pcs_mere CHAR (2),
  9. PRIMARY KEY (id)
  10. );
  11. CREATE TABLE ifepsa.resultats(
  12. id_etudiant integer,
  13. annee CHAR(9),
  14. id_cursus integer,
  15. libelle_cursus CHAR(100) NOT NULL,
  16. niveau CHAR(10) NOT NULL,
  17. section CHAR(60) NOT NULL,
  18. boursier boolean,
  19. annulation CHAR (100),
  20. semestre CHAR (10) NOT NULL,
  21. parcours CHAR (35),
  22. session1 boolean,
  23. session2 boolean,
  24. PRIMARY KEY (id_etudiant,annee,semestre),
  25. FOREIGN KEY(id_etudiant) REFERENCES ifepsa.etudiant(id),
  26. FOREIGN KEY(id_cursus) REFERENCES ifepsa.diplome(id) ON UPDATE CASCADE
  27. );

Message cité 1 fois
Message édité par grundoc le 24-06-2011 à 17:32:22

---------------
Mes vente
Reply

Marsh Posté le 24-06-2011 à 17:44:31    

grundoc a écrit :

Le deuxième ne marche pas non plus.


 
Quelle est le message?
 

grundoc a écrit :


En faite, je doit compter les id des étudiant (table étudiant) si il sont présent en L1 une année et en L1 l'année suivante.


ça j'avais compris...:D


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 24-06-2011 à 17:46:42    

Voila l'erreur :
 
ERREUR:  la référence à la colonne « semestre » est ambigu
LINE 26: ...s2 ON (res2.id_etudiant = etd.id AND sexe = 1 AND semestre='...
 
Merci beaucoup pour votre aide.


---------------
Mes vente
Reply

Marsh Posté le 24-06-2011 à 18:10:53    

C'est pas bien compliqué à corriger ça, il suffit de préfixer par le nom de la table ou son alias à chaque fois...


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 24-06-2011 à 18:10:53   

Reply

Marsh Posté le 24-06-2011 à 19:45:47    

Merci , ça marche du tonner !
 


---------------
Mes vente
Reply

Marsh Posté le 24-06-2011 à 20:49:19    

Maintenant il te reste à comprendre pourquoi...;)


---------------
Can't buy what I want because it's free -
Reply

Sujets relatifs:

Leave a Replay

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