OVH Cloud OVH Cloud

pb sql :-(

3 réponses
Avatar
Olivier
Bonjour

je demande de l'aide car là je sais pas faire la requête.

J'ai des étudiants qui suivent deux formations : on va dire Type 1 et Type
2.
Tous les étudiants commencent par le type 1 et au bout de 10 formations du
type 1, débutent la type 2.

Comment avoir les listes suivantes :

- Les étudiants qui sont en cours de formations du type 1, (et donc qui ne
sont pas encore en type 2)
- Les étudiants qui sont en type 2


Merci, pour votre aide.
Olivier

3 réponses

Avatar
Fred BROUARD
Olivier a écrit:
Bonjour

je demande de l'aide car là je sais pas faire la requête.

J'ai des étudiants qui suivent deux formations : on va dire Type 1 et Type
2.
Tous les étudiants commencent par le type 1 et au bout de 10 formations du
type 1, débutent la type 2.

Comment avoir les listes suivantes :

- Les étudiants qui sont en cours de formations du type 1, (et donc qui ne
sont pas encore en type 2)



SELECT ...
FROM ... T1
WHERE ... = Type1
AND NOT EXISTS (SELECT *
FROM ... T2
WHERE T1. ??? = T2. ???
AND ... = Type2)

Par, exemple.
Mais sans la description complète de vos table et colonnes, difficie d'en dire
plus. Merci de lire ceci http://www.developpez.net/forums/viewtopic.php?t2668
et de poster le code SQL de la création de vos table et le jeu de données qui va
avec...



- Les étudiants qui sont en type 2




SELECT ...
FROM ... T1
WHERE ... = Type2


Merci, pour votre aide.
Olivier





A +

--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************
Avatar
Fred BROUARD
Au passage c'est une très mauvaise idée que de donnéer des noms différent à des
colonnes qui ont la même signification et des noms identiques pour des colonnes
sémantiquement différents.

ainsi la colonne ID dans les deux tables devrait signifier la même chose ne
serai-ce que pour assurer la jointure. Or ID dans la table etudiant signifie la
clef de la table étudiant et dans la table cours la clef de la table cours !
Vous auriez du mettre par exemple ID_ETUDIANT dans une table et ID_COURS dans
l'autre comme colonne clef.

De même faire une jointure sur deux colonnes de noms différents ID = student_id
ne saute pas aux yeux du premier venu. Lorque vous aurez 100 tables, je vais me
marrer en lisant les nombreuses erreurs de jointure...

Pour introduire une confusion encore plus grande vous utilisez tantôt l'anglais
tantôt le français dans vos construction de tables... Exemple :
table etudiants, colonne student_id, puis date_cours !!!

Il serait d'ailleurs plus intelligent de commencer par modéliser au niveau
conceptuel cela evite ce genre d'erreur stupides...

Autre remarque, mais c'est du confort : on ne met JAMAIS de pluriel à un nom de
table. Si vous utilisez un SGBDR ce n'est pas pour mettre une seule ligne dans
chaque table. Tout le monde comprend bien qu'il va y avoir pluralité
d'occurrences ! Donc le pluriel est inutile et superflus. Il fait perdre du
temps à tous les niveaux.



Comment avoir les listes suivantes :

- Les étudiants qui sont en cours de formations du type 1, (et donc qui
ne
sont pas encore en type 2)








SELECT DISTINCT e.*
FROM etudiants e
INNER JOIN cours c
ON e.id = c.student_id
WHERE c.type_cours = 1
AND NOT EXISTS (SELECT *
FROM etudiants e2
INNER JOIN cours c2
ON e2.id = c2.student_id
WHERE e2.id = e.id
AND c2.type_cours = 2)





- Les étudiants qui sont en type 2








SELECT DISTINCT e.*
FROM etudiants e
INNER JOIN cours c
ON e.id = c.student_id
WHERE c.type_cours = 2

A +

--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************
Avatar
Olivier
Ok bien reçu toutes les remarques.

Ceci entendu, comme je suis tout seul, y a pas de pb...
Pour les jointures comme je renomme toujours les tables avec des Alias
(etudiants E, .... cours C...)
je ne confonds jamais les tables... mais c'est vrai que je n'ai pas 100
tables...


Merci pour la réponse qui marche impec.

Olivier



"Fred BROUARD" a écrit dans le message de news:

Au passage c'est une très mauvaise idée que de donnéer des noms différent
à des colonnes qui ont la même signification et des noms identiques pour
des colonnes sémantiquement différents.

ainsi la colonne ID dans les deux tables devrait signifier la même chose
ne serai-ce que pour assurer la jointure. Or ID dans la table etudiant
signifie la clef de la table étudiant et dans la table cours la clef de la
table cours ! Vous auriez du mettre par exemple ID_ETUDIANT dans une table
et ID_COURS dans l'autre comme colonne clef.

De même faire une jointure sur deux colonnes de noms différents ID =
student_id ne saute pas aux yeux du premier venu. Lorque vous aurez 100
tables, je vais me marrer en lisant les nombreuses erreurs de jointure...

Pour introduire une confusion encore plus grande vous utilisez tantôt
l'anglais tantôt le français dans vos construction de tables... Exemple :
table etudiants, colonne student_id, puis date_cours !!!

Il serait d'ailleurs plus intelligent de commencer par modéliser au niveau
conceptuel cela evite ce genre d'erreur stupides...

Autre remarque, mais c'est du confort : on ne met JAMAIS de pluriel à un
nom de table. Si vous utilisez un SGBDR ce n'est pas pour mettre une seule
ligne dans chaque table. Tout le monde comprend bien qu'il va y avoir
pluralité d'occurrences ! Donc le pluriel est inutile et superflus. Il
fait perdre du temps à tous les niveaux.



Comment avoir les listes suivantes :

- Les étudiants qui sont en cours de formations du type 1, (et donc qui
ne
sont pas encore en type 2)








SELECT DISTINCT e.*
FROM etudiants e
INNER JOIN cours c
ON e.id = c.student_id
WHERE c.type_cours = 1
AND NOT EXISTS (SELECT *
FROM etudiants e2
INNER JOIN cours c2
ON e2.id = c2.student_id
WHERE e2.id = e.id
AND c2.type_cours = 2)





- Les étudiants qui sont en type 2








SELECT DISTINCT e.*
FROM etudiants e
INNER JOIN cours c
ON e.id = c.student_id
WHERE c.type_cours = 2

A +

--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************