bonjour soit la table suivants personne(numpersonne,nom,prenom,nupere,numere,sexe) la question :donner le nom le prénom et le nombre de d'enfants de chaque personne
bonjour soit la table suivants personne(numpersonne,nom,prenom,nupere,numere,sexe) la question :donner le nom le prénom et le nombre de d'enfants de chaque personne
Bonjour,Apparemment, vous avez un problème pour faire votre exercice !
Je peux le comprendre, on est tous plus ou moins novice dans un domaine ou un autre...
Cela dit, vous êtes sur un forum non pas d'assistanat mais d'entraide et pour vous aider, il faudrait déjà savoir ce que vous avez essayé de faire pour résoudre votre problème !
Ce n'est pas en vous donnant du prémâché de SQL que vous progresserez...
Philippe.
Bonjour, bienvenue sur le forum et meilleurs vœux,
Comme l'a indiqué Philippe, le forum n'a pas pour but de fournir des solutions aux devoirs/exercices des étudiants. Lorsque vous vous êtes inscrits vous avez oublié, comme beaucoup d'autres, de lire les règles du forum
à l'intérieur de ces règles vous auriez pu lire ce chapitre
Un minimum de règles s'appliquent également en ce qui concerne le forum SQL, une description de(s) table(s) étant le minimum, le mieux étant un script de création des tables impliquées et d'un jeu d'essai . Mais surtout, à minima, fournir les instructions/pistes que vous avez déjà pu abordé. Dans votre cas, on a franchement l'impression que rien n'a été fait ! j'ai même l'impression que vous avez condensé le texte de l'exercice !IV-N. Lycéen, collégien, étudiant, (bref un apprenti développeur)
Vous êtes les bienvenus ici pour vous former.
Vous former, cela veut dire lire les cours et tutoriels :
http://www.developpez.com/cours/
et éventuellement poser vos questions en français correct si vous avez besoin d'aide, dans un seul forum, et dans le respect des règles du forum.
Nous ne sommes pas là pour faire vos exercices.
Entendez par là que nous serons bien évidemment tout à fait d'accord pour vous aider à résoudre votre problème, pour autant que vous fassiez vous-même des efforts.
Postez votre question, mais proposez également un début de solution, un bout de code, etc. En aucun cas, nous ne ferons le travail à votre place.
Merci de votre compréhension.
Ayant été professeur, je suis sûr que le votre a du vous fournir tous les éléments nécessaires pour réaliser cet exercice .Vous avez certainement abordé les agrégats SUM, MAX ... et l'indispensable GROUP BY, voilà votre piste de travail. Une autre piste, si vous l'avez abordé en cours, ce sont les CTE (Common Table Expression) et les jointures (JOIN)
MVP Embarcadero
Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
SGBD : Firebird 2.5, 3, SQLite
générateurs États : FastReport, Rave, QuickReport
OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd
non pas du tout le problème c'est que j'ai essai plusieur requetes seule ,mais aucune resultat c'est pour ça j'ai besoin de votre aide:et voici une de ces requetes:
select nom,prenom,count(nupere) from personne where numpersonne in(select nupere from personne ) groupe by nom,prenom.
Bonjour,
Admettons, bien que j'ai quelques doutes car si vous ne débutiez pas sur le forum, au lieu de me reciter dans votre dernier message vous auriez accéder à ma demandeoui j'ai connait les regles de ce forum .et je suis pas un debutanat dans sql .
une description de(s) table(s) étant le minimum, le mieux étant un script de création des tables impliquées et d'un jeu d'essai . Mais surtout, à minima, fournir les instructions/pistes que vous avez déjà pu abordé.me semble une meilleure approche que l'on peut ensuite améliorer
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 SELECT NUMPERE AS PARENT,COUNT(1) AS NOMBRE ENFANTS FROM PERSONNE GROUP BY NUMPERE UNION SELECT NUMMERE,COUNT(1) FROM PERSONNE GROUP BY NUMMERE
- soit en en faisant une CTE qui sera utilisée ensuite avec une Jointure pour obtenir les nom st prénom du parent
- soit en utilisant une jointure pour les deux clauses select
Dommage que l'on ait pas un jeu d'essai important pour vérifier quelle serait la méthode la plus rapide !
MVP Embarcadero
Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
SGBD : Firebird 2.5, 3, SQLite
générateurs États : FastReport, Rave, QuickReport
OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd
Bonjour,
deux clics de souris à partir de cette discussion vous amène à http://sgbd.developpez.com/cours/
et aux incontournables cours de Frederic Brouard aka SQLPro http://sql.developpez.com/
bien sûr les SGBDs n'ont pas toujours les mêmes syntaxes et possibilités mais tout y est (ou presque)
l'UNION ne devrait pas vous poser de problème puisque
pour ce qui est des jointures http://sqlpro.developpez.com/cours/sqlaz/jointures/Envoyé par maloti
pour ce qui est des CTE (Common Table Expression) http://www.firebirdsql.org/refdocs/l...d21-select-cte
et dernier point, merci de ne pas mettre vos réflexions/demande dans le titre du sujet quand on regarde l'historique des messages on ne les voit pas du coup voir une citation d'un autre post (message #5) ou un simple smiley (message #7) c'est loin d'être explicite
MVP Embarcadero
Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
SGBD : Firebird 2.5, 3, SQLite
générateurs États : FastReport, Rave, QuickReport
OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd
bonjour , j'ai une petite question voici la question:donner les grand parents maternelle de 'lili samira'.
ma solution et comme suite :
ma solution et correcte mais je pense qu'elle et un peut compliquer .es que tu peut me donner votre avis?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 select * from personne where NumPersonne in( (select NuPere from personne where NumPersonne =(select NuMere from personne where Nom='lili' and Prenom='Samira'))UNION (select NuMere from personne where NumPersonne =(select NuMere from Personne where Nom='lili' and Prenom='Samira')));
et excusez moi pour dérangement
Dernière modification par SergioMaster ; 07/01/2015 à 08h28. Motif: balises de code,orthographe
merci beaucoup mr sergio. ma sollution et comme suite :
le problème que lorsque j'ai tester elle ne donne pas une résultat correcte.et ce qu'il m'intéresse si juste le nom et prénom de père et le nombre de ces enfants.
Code : Sélectionner tout - Visualiser dans une fenêtre à part select nom,prenom,count(numpersonne) from personne in(select nupere from personne) group by nom,prenom;
et merci beaucoup pour votre aide ,parce que j'ai des examens la semaine prochaine.
Dernière modification par SergioMaster ; 07/01/2015 à 08h30. Motif: balises de code
Bonjour,Cela m'étonnerait que vous l'ayez testée car elle est syntaxiquement incorrecte !
Ce que l'on attendait de vous (explicité par SergioMaster) : la description des tables et un jeu d'essai :
Ici, sont absentes les contraintes supplémentaires que l'on aurait pu mettre sur les clés étrangères, à savoir que :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 /* Table Personne */ CREATE TABLE PERSONNE ( NUMPERSONNE INTEGER NOT NULL, NOM VARCHAR(16) NOT NULL, PRENOM VARCHAR(16), NUPERE INTEGER, NUMERE INTEGER, SEXE CHAR(1) ); /* Clé primaire */ ALTER TABLE PERSONNE ADD CONSTRAINT PK_PERSONNE PRIMARY KEY (NUMPERSONNE); /* Clés étrangères */ ALTER TABLE PERSONNE ADD CONSTRAINT FK_PERSONNE_1 FOREIGN KEY (NUPERE) REFERENCES PERSONNE (NUMPERSONNE); ALTER TABLE PERSONNE ADD CONSTRAINT FK_PERSONNE_2 FOREIGN KEY (NUMERE) REFERENCES PERSONNE (NUMPERSONNE); /* Jeu d'essai */ INSERT INTO PERSONNE (NUMPERSONNE, NOM, PRENOM, NUPERE, NUMERE, SEXE) VALUES (1, 'N1', 'P1', NULL, NULL, 'M'); INSERT INTO PERSONNE (NUMPERSONNE, NOM, PRENOM, NUPERE, NUMERE, SEXE) VALUES (2, 'N2', 'P2', NULL, NULL, 'F'); INSERT INTO PERSONNE (NUMPERSONNE, NOM, PRENOM, NUPERE, NUMERE, SEXE) VALUES (3, 'N3', 'P3', 1, 2, 'M'); INSERT INTO PERSONNE (NUMPERSONNE, NOM, PRENOM, NUPERE, NUMERE, SEXE) VALUES (4, 'N4', 'P4', 1, 2, 'F'); INSERT INTO PERSONNE (NUMPERSONNE, NOM, PRENOM, NUPERE, NUMERE, SEXE) VALUES (5, 'N5', 'P5', NULL, NULL, 'M'); INSERT INTO PERSONNE (NUMPERSONNE, NOM, PRENOM, NUPERE, NUMERE, SEXE) VALUES (6, 'N6', 'P6', NULL, NULL, 'F'); INSERT INTO PERSONNE (NUMPERSONNE, NOM, PRENOM, NUPERE, NUMERE, SEXE) VALUES (7, 'N7', 'P7', 5, 6, 'M'); INSERT INTO PERSONNE (NUMPERSONNE, NOM, PRENOM, NUPERE, NUMERE, SEXE) VALUES (8, 'N8', 'P8', 5, 6, 'F'); INSERT INTO PERSONNE (NUMPERSONNE, NOM, PRENOM, NUPERE, NUMERE, SEXE) VALUES (9, 'N9', 'P9', NULL, NULL, 'M'); INSERT INTO PERSONNE (NUMPERSONNE, NOM, PRENOM, NUPERE, NUMERE, SEXE) VALUES (10, 'N10', 'P10', NULL, NULL, 'F'); INSERT INTO PERSONNE (NUMPERSONNE, NOM, PRENOM, NUPERE, NUMERE, SEXE) VALUES (11, 'N11', 'P11', 9, 10, 'M'); INSERT INTO PERSONNE (NUMPERSONNE, NOM, PRENOM, NUPERE, NUMERE, SEXE) VALUES (12, 'N12', 'P12', 9, 10, 'F'); INSERT INTO PERSONNE (NUMPERSONNE, NOM, PRENOM, NUPERE, NUMERE, SEXE) VALUES (13, 'N13', 'P13', 3, 8, 'M'); INSERT INTO PERSONNE (NUMPERSONNE, NOM, PRENOM, NUPERE, NUMERE, SEXE) VALUES (14, 'N14', 'P14', 3, 8, 'F'); INSERT INTO PERSONNE (NUMPERSONNE, NOM, PRENOM, NUPERE, NUMERE, SEXE) VALUES (15, 'N15', 'P15', 3, 8, 'F');
- NUMERE doit être liée à NUMPERSONNE pour lequel SEXE = 'F' et que NUPERE doit être liée à NUMPERSONNE pour lequel SEXE = 'M'.
- NUMERE doit être différent de NUPERE pour une ligne de la table.
A partir de là et du résultat attendu (voir ci après), on peut écrire les requêtes.
N1 P1 2
N2 P2 2
N3 P3 3
N4 P4 0
N5 P5 2
N6 P6 2
N7 P7 0
N8 P8 3
N9 P9 2
N10 P10 2
N11 P11 0
N12 P12 0
N13 P13 0
N14 P14 0
N15 P15 0
On peut le faire avec une sous requête (l'alias P correspond à "Parents" et l'alias E correspond à "Enfants"):
On peut le faire avec une jointure (externe pour tenir compte des personnes sans enfant):
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 SELECT P.NUMPERSONNE, P.NOM, P.PRENOM, (SELECT count(*) FROM PERSONNE WHERE NUPERE = P.NUMPERSONNE OR NUMERE = P.NUMPERSONNE) AS NBENFANTS FROM PERSONNE P
On peut aussi le faire avec des requetes CTE comme l'a dit SergioMaster.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 SELECT P.NUMPERSONNE, P.NOM, P.PRENOM, count(E.NUMPERSONNE) AS NBENFANTS FROM PERSONNE P LEFT JOIN PERSONNE E ON E.NUPERE = P.NUMPERSONNE OR E.NUMERE = P.NUMPERSONNE GROUP BY P.NUMPERSONNE, P.NOM, P.PRENOM
Pour la requête relative aux grands parents maternels, cela m'étonnerait aussi que vous l'ayez testée car elle est également syntaxiquement incorrecte !
Essayez plutôt ce qui suit :
Cela dit, on peut écrire cela de manière nettement plus simple (en s'inspirant des solutions que j'ai données à votre 1° question):
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 SELECT * FROM PERSONNE WHERE NUMPERSONNE IN (SELECT NUPERE FROM PERSONNE WHERE NUMPERSONNE = (SELECT NUMERE FROM PERSONNE WHERE NOM = 'lili' AND PRENOM = 'Samira')) UNION SELECT * FROM PERSONNE WHERE NUMPERSONNE IN (SELECT NUMERE FROM PERSONNE WHERE NUMPERSONNE = (SELECT NUMERE FROM PERSONNE WHERE NOM = 'lili' AND PRENOM = 'Samira'))
- une requête avec une jointure et une sous requête dans la clause WHERE
- une requête avec 2 jointures
Philippe.
Bonjour,
Merci Philippe pour : la description des tables et un jeu d'essai, je n'avais franchement pas le courage de m'y attaquer , cela me permettra peut être de vérifier quelques théories sur les temps de réalisation .
Note:
la règle 2 me semble inutile à cause de la règle 1 ?Ici, sont absentes les contraintes supplémentaires que l'on aurait pu mettre sur les clés étrangères, à savoir que :
1. NUMERE doit être liée à NUMPERSONNE pour lequel SEXE = 'F' et que NUPERE doit être liée à NUMPERSONNE pour lequel SEXE = 'M'.
2. NUMERE doit être différent de NUPERE pour une ligne de la table.
MVP Embarcadero
Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
SGBD : Firebird 2.5, 3, SQLite
générateurs États : FastReport, Rave, QuickReport
OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd
MVP Embarcadero
Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
SGBD : Firebird 2.5, 3, SQLite
générateurs États : FastReport, Rave, QuickReport
OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd
j'ai pas compris quelle est la différence entre ma solution et votre solution!!!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 select * from personne where NumPersonne in( (select NuPere from personne where NumPersonne =(select NuMere from personne where Nom='Lili' and Prenom='Samira'))UNION (select NuMere from personne where NumPersonne =(select NuMere from Personne where Nom='Lili' and Prenom='Samira')));
Dernière modification par SergioMaster ; 07/01/2015 à 14h52. Motif: balises de code
votre Query est effectivement incorrecte, regardez attentivement ce que vous avez écrit :Envoyé par Ph.B.
il manque un WHERE et un nom de champ !
Code : Sélectionner tout - Visualiser dans une fenêtre à part FROM PERSONNE IN (SELECT
Philippe vous a donné une solution
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 SELECT P.NUMPERSONNE, P.NOM, P.PRENOM, (SELECT count(*) FROM PERSONNE WHERE NUPERE = P.NUMPERSONNE) AS NBENFANTS -- j'ai enlevé le OR NUMERE=P.NUMPERSONNE FROM PERSONNE PPourtant il y en a une (outre le fait que mettre le code entre balise (utilisation du bouton #) est la bonne pratique (j'en ai marre de corriger)j'ai pas compris quelle est la différence entre ma solution et votre solution!!!
Philippe propose 2 SELECT et une UNION
vous 1 seul SELECT
P.S. l'utilisation de SELECT dans les clauses WHERE c'est pas facile à lire !
MVP Embarcadero
Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
SGBD : Firebird 2.5, 3, SQLite
générateurs États : FastReport, Rave, QuickReport
OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd
Courage...
Ma requête n'est d'ailleurs pas des plus optimisées, mais la sienne n'est déjà pas correcte syntaxiquement.
Il aurait du écrire (j'ai mis en commentaire les erreurs !) :
D'autre part, cette requête ne fonctionnera pas si il y a un homonyme dans sa base de données (même nom et même prénom)...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 select * from personne where NumPersonne in /*(*/ ( select NuPere from personne where NumPersonne = (select NuMere from personne where Nom = 'lili' and Prenom = 'Samira') /*)*/ UNION /*(*/ select NuMere from personne where NumPersonne = (select NuMere from Personne where Nom = 'lili' and Prenom = 'Samira') /*)*/ )
Philippe.
bonjour,juste pour la révision.j'ai créer une trigger qui déclencher lors de de l'ajout d'un nouveau personne et stocké son numéro et le nombre de ces enfants on tableau enf(numpersonne,nbr_ enfant).donner mois votre avis svp :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 create or replace trigger after insert on personne declare nbr integer; begin SELECT count(*) into nbr FROM PERSONNE WHERE NUPERE =:new.numpersonne; insert into enf values(:new.numpersonne,nbr); end.
Dernière modification par SergioMaster ; 08/01/2015 à 08h01. Motif: balises de code
- On vous a déjà dit d'utiliser les balises [CODE] pour présenter vos instructions SQL
- Il s'agit d'un autre sujet (vous avez marqué résolu le 1° !), il eut été judicieux de votre part d'ouvrir une autre discussion
- Vous ne tenez pas compte de ce qu'on a pu vous expliquer ou présenter précedemment
Bref :
- votre requête de comptage est partielle et potentiellement fausse, elle ne s'applique qu'au père (quid des mères ?) et encore faut il que la ligne insérée dans la table personne corresponde à un homme !
- votre raisonnement en lui même est faux : vous venez d'insérer une ligne personne, cette personne ne peut pas avoir d'enfant déjà saisi dans la table (violation des contraintes d'intégrité référentielle)
La ligne insérée ne peut concerner qu'une personne qui est enfant d'une autre dont la ligne est déjà présente dans la table. C'est pour cette dernière qu'il faut recalculer le nombre d'enfants, voire 2 lignes car il peut y avoir 2 parents référencés dans la table !
Philippe.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager