Requête complexe avec jointure

Signaler
Messages postés
10
Date d'inscription
samedi 16 juin 2007
Statut
Membre
Dernière intervention
5 janvier 2010
-
Messages postés
10
Date d'inscription
samedi 16 juin 2007
Statut
Membre
Dernière intervention
5 janvier 2010
-
Bonjour,
J'ai pas fait de SQL de puis un moment et la je bloque depuis un jour sur une fichu requête; je vais essayer de vous expliquer au mieux mon problème.

j'ai 2 tables :

- ASSOCIER_COURSE(#Num_demande,#Num_course,#Num_statut_course,Date_associer_course)
- STATUT_COURSE (Num_statut_course, Nom_statut_course)

Je veux avoir les courses qui sont uniquement au statut 1 (Nom_statut_course: 1.En attente d'enlèvement) et pas les courses qui peuvent déjà être à un statut supérieur.
Seulement dans une demande je peux avoir plusieurs course
Ex:
Num_demande | Num_course
1 | 1
1 | 2
1 | 3
2 | 1
3 | 1

Voici la requête qui vous montrera au mieux la ou je bloque :

SELECT AC.Num_demande, AC.Num_course, AC.Num_statut_course, SC.Nom_statut_course, AC.Date_associer_course
FROM ASSOCIER_COURSE AS AC, STATUT_COURSE AS SC
WHERE AC.Num_statut_course = SC.Num_statut_course
and AC.Num_statut_course = '1'
and AC.Num_course not in (select AC1.Num_course from ASSOCIER_COURSE AC1
where AC1.Num_statut_course = '2'
or AC1.Num_statut_course = '3'
or AC1.Num_statut_course = '4'
or AC1.Num_statut_course = '5'
or AC1.Num_statut_course = '6');


Le problème c'est que je prends en compte que le Num_course et pas la relation entre le Num_demande et le Num_course.
Le résultat est que je n'affiche que les course qui ont un statut uniquement à 1, mais par exemple :
Num_demande | Num_course
1 | 1
1 | 2
2 | 1
ma requête devrais me retourner :
2 | 1
Seulement ma requête va également ne pas afficher cette ligne car pour elle la course 1 à un statut 2 sans prendre en compte le Num_demande.

J'espère avoir été le plus claire possible...

Merci par avance de votre aide.

9 réponses

Messages postés
345
Date d'inscription
mardi 1 juin 2004
Statut
Membre
Dernière intervention
17 octobre 2014
3
Bonjour,

Si j'ai bien compris, ce serait

...
Group By AC.Num_demande, AC.Num_course, SC.Nom_statut_course, AC.Date_associer_course
having max(AC.Num_statut_course) = 1


thip
Messages postés
10
Date d'inscription
samedi 16 juin 2007
Statut
Membre
Dernière intervention
5 janvier 2010

j'ai déjà essayé cette solution mais j'ai le message d'erreur suivant : Aucune valeur donnée pour un ou plusieurs des paramètres requis.

En gros je pense qu'il veut que je lui passe un Num_statut_course en paramètre ... ce que je ne veux pas faire.
Messages postés
345
Date d'inscription
mardi 1 juin 2004
Statut
Membre
Dernière intervention
17 octobre 2014
3
???

Tu as bien retiré le select sur AC1 ?

select n°demande, N°course, .., max(n°st)
from ..
where (lien 2 tables) <-- tu peux aussi faire un join
having max(n°st)=1


thip
Messages postés
10
Date d'inscription
samedi 16 juin 2007
Statut
Membre
Dernière intervention
5 janvier 2010

je veux afficher mon Num_statut_course, donc non je ne l'ai pas retiré, mais je l'ai ajouté dans le group by...

Voici la requête avec ta méthode
SQL à la sauce VB.NET

"SELECT AC.Num_demande AS NuméroDemande, " & _
                "AC.Num_course AS NuméroCourse, " & _
                "SC.Nom_statut_course AS Statut, " & _
                "AC.Num_statut_course AS NuméroStatutCourse, " & _
                "AC.Date_associer_course AS DateMAJStatut " & _
        "FROM ASSOCIER_COURSE AS AC, STATUT_COURSE AS SC " & _
        "WHERE(AC.Num_statut_course = SC.Num_statut_course) " & _
        "AND AC.Num_statut_course = '1' " & _
        "Group By AC.Num_demande, AC.Num_course, SC.Nom_statut_course, AC.Date_associer_course, AC.Num_statut_course " & _
        "having (max(AC.Num_statut_course) = 1)"
Messages postés
345
Date d'inscription
mardi 1 juin 2004
Statut
Membre
Dernière intervention
17 octobre 2014
3
Retire :
AND AC.Num_statut_course = '1'

c'est le max() =1 qui le fait.

Et puis pourquoi le mettre dans le select, il n'y a qu'une seule valeur.

thip
Messages postés
10
Date d'inscription
samedi 16 juin 2007
Statut
Membre
Dernière intervention
5 janvier 2010

j'ai donc cette requête :

"SELECT AC.Num_demande AS NuméroDemande, " & _
"AC.Num_course AS NuméroCourse, " & _
"SC.Nom_statut_course AS Statut, " & _
"AC.Date_associer_course AS DateMAJStatut " & _
"FROM ASSOCIER_COURSE AS AC, STATUT_COURSE AS SC " & _
"WHERE(AC.Num_statut_course = SC.Num_statut_course) " & _
"Group By AC.Num_demande, AC.Num_course, SC.Nom_statut_course, AC.Date_associer_course " & _
"having (max(AC.Num_statut_course) = 1)"

Mais toujours le message d'erreur : Type de données incompatible dans l'expression du critère.
Messages postés
10
Date d'inscription
samedi 16 juin 2007
Statut
Membre
Dernière intervention
5 janvier 2010

c'est bon j'ai trouvé ma solution ^^

Merci tpoinsot

Ma solution !!!

SELECT a.Num_demande, a.Num_course
FROM ASSOCIER_COURSE AS a
WHERE a.Num_statut_course = 1
AND NOT EXISTS (
SELECT *
FROM ASSOCIER_COURSE AS b
WHERE b.Num_demande = a.Num_demande
AND b.Num_course = a.Num_course
AND b.Num_statut_course > 1
)
Messages postés
345
Date d'inscription
mardi 1 juin 2004
Statut
Membre
Dernière intervention
17 octobre 2014
3
Et ton erreur, tu l'as plus ?

je voulais te demander les types de l'égalité
WHERE(AC.Num_statut_course = SC.Num_statut_course)


thip
Messages postés
10
Date d'inscription
samedi 16 juin 2007
Statut
Membre
Dernière intervention
5 janvier 2010

dans ma BDD j'ai tout mis en TEXT... je gère les types sur VB.NET