Resolu :Sql : probleme de requete (Subquery returns more than 1 row)

Resolu :Sql : probleme de requete (Subquery returns more than 1 row) - SQL/NoSQL - Programmation

Marsh Posté le 13-11-2012 à 16:36:16    

Bonjour à tous,
 
Je rencontre un petit probleme avec une requete SQL.
Je vais essayer d'expliquer clairement la structure de la base et surtout le resultat escompté de cette requete !
 
Je développe un petit logiciel permettant de gérer les périodes de congés. Une table reprend les coordonnées des collegues (nom, prenom, login, mdp, personne en charge de valider leur conges).
Une seconde table enregistre les demandes de conges avec leur statut (1 = valide, 2=refuse, 3=en attente) ainsi que les dates demandées.
 
Je dois pouvoir extraire les agents ayant le même valideur + les demandes du valideur lui même (afin de reprendre les demandes du même service).
 
Actuellement ma requete ressemble à ca (mais me retourne Subquery returns more than 1 row)
 

Code :
  1. SELECT * from conges WHERE id_agent=(SELECT id_agent from agent WHERE id_valideur = 'mdupont')  AND statut_demande = '1' AND MONTH( date_deb ) = '11' OR statut_demande = '1' AND MONTH( date_fin ) = '11' OR id_agent='mdupont' AND statut_demande = '1' AND MONTH( date_deb ) = '11' OR id_agent='mdupont' AND statut_demande = '1' AND MONTH( date_fin ) = '11'


 
cette requete devrait m'indiquer les agents validés par mdupont et les conges de mdupont etant validés et posés sur la periode de novembre...
 
Quelqu'un aurait il une idee de ce qui bloque ?
 
Merci d'avance.


Message édité par mozvillat le 14-11-2012 à 09:27:26
Reply

Marsh Posté le 13-11-2012 à 16:36:16   

Reply

Marsh Posté le 14-11-2012 à 09:00:02    

Bonjour,
 
Et si tu fais ça, ça te renvoie quelle valeur ?

Code :
  1. SELECT count(id_agent) from agent WHERE id_valideur = 'mdupont'


 
Sinon, tu peux faire avec un join :

Code :
  1. SELECT * from conges
  2. inner join agent on conges.id_agent = agent.id_agent and id_valideur = 'mdupont' 
  3. where (statut_demande = '1' AND MONTH( date_deb ) = '11')
  4. OR (statut_demande = '1' AND MONTH( date_fin ) = '11')
  5. OR (id_agent='mdupont' AND statut_demande = '1' AND MONTH( date_deb ) = '11')
  6. OR (id_agent='mdupont' AND statut_demande = '1' AND MONTH( date_fin ) = '11')


 


---------------
Bel ours Vave, je me dois de l’admettre. -Skyl"win"-  Mais toi tu es intelligent -Homerde- - Ce génie -SkylWINd- JDD S16M72 10:43:46 GMT-DTC +1
Reply

Marsh Posté le 14-11-2012 à 09:05:29    

Pour la première partie, puisque ta sous-requête retourne plusieurs lignes, il faut utiliser "id_agent in" au lieu de "id_agent=" :

 
Code :
  1. SELECT * from conges WHERE id_agent=(SELECT id_agent from agent WHERE id_valideur = 'mdupont')
 

Sinon pour la requête en elle même, je pense qu'il est possible de la simplifier un peu, un truc du genre :

 
Code :
  1. SELECT *
  2. FROM conges
  3. WHERE id_agent IN (
  4.     SELECT id_agent FROM agent WHERE id_valideur = 'mdupont' OR id_agent='mdupont' )
  5. AND statut_demande = '1'
  6. AND (
  7.     MONTH( date_deb ) = '11'
  8.     OR MONTH( date_fin ) = '11')
 

Après tu peut même faire une procédure stockée prenant en paramètre le mois et l'id_agent


Message édité par x1fr le 14-11-2012 à 09:06:19

---------------
Origin / PSN / Steam / Uplay : x1fr - bnet : Fab#2717
Reply

Marsh Posté le 14-11-2012 à 09:27:00    

Merci pour ces précisons ! c'est la que je me rend compte : pourquoi faire compliqué quand on peut faire simple !!!!

Reply

Marsh Posté le 15-11-2012 à 11:07:49    

Quand c'est possible, éviter les OR : ça pourrit les perfs :/


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Sujets relatifs:

Leave a Replay

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