IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Firebird Discussion :

le nombre d'enfants d'un personne


Sujet :

SQL Firebird

  1. #1
    Invité
    Invité(e)
    Par défaut le nombre d'enfants d'un 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

  2. #2
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Bonjour,
    Citation Envoyé par maloti Voir le message
    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
    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.

  3. #3
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 037
    Points : 40 943
    Points
    40 943
    Billets dans le blog
    62
    Par défaut
    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

    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.
    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 !

    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

  4. #4
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Ph. B. Voir le message
    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...
    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.

  5. #5
    Invité
    Invité(e)
    Par défaut oui j'ai connait les regles de ce forum .et je suis pas un debutanat dans sql .
    Citation Envoyé par SergioMaster Voir le message
    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 !

    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)

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 037
    Points : 40 943
    Points
    40 943
    Billets dans le blog
    62
    Par défaut
    Bonjour,
    oui j'ai connait les regles de ce forum .et je suis pas un debutanat dans sql .
    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 demande
    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é.
    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
    me semble une meilleure approche que l'on peut ensuite améliorer
    - 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

  7. #7
    Invité
    Invité(e)
    Par défaut pouvez me donnez quelque cour sql avancé ? et merci beaucoup

  8. #8
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 037
    Points : 40 943
    Points
    40 943
    Billets dans le blog
    62
    Par défaut
    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
    Citation Envoyé par maloti
    je suis pas un debutanat dans sql
    pour ce qui est des jointures http://sqlpro.developpez.com/cours/sqlaz/jointures/
    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

  9. #9
    Invité
    Invité(e)
    Par défaut
    bonjour , j'ai une petite question voici la question:donner les grand parents maternelle de 'lili samira'.
    ma solution et comme suite :
    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')));
    ma solution et correcte mais je pense qu'elle et un peut compliquer .es que tu peut me donner votre avis?

    et excusez moi pour dérangement
    Dernière modification par SergioMaster ; 07/01/2015 à 08h28. Motif: balises de code,orthographe

  10. #10
    Invité
    Invité(e)
    Par défaut
    merci beaucoup mr sergio. ma sollution et comme suite :
    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;
    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.

    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

  11. #11
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Bonjour,
    Citation Envoyé par maloti Voir le message
    merci beaucoup mr sergio. ma sollution et comme suite :select nom,prenom,count(numpersonne) from personne in(select nupere from personne) group by nom,prenom;

    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.
    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 :
    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');
    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.

    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"):
    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 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
    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
    On peut aussi le faire avec des requetes CTE comme l'a dit SergioMaster.

    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 :
    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'))
    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):
    1. une requête avec une jointure et une sous requête dans la clause WHERE
    2. une requête avec 2 jointures
    Philippe.

  12. #12
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 037
    Points : 40 943
    Points
    40 943
    Billets dans le blog
    62
    Par défaut
    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:
    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.
    la règle 2 me semble inutile à cause de la règle 1 ?
    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

  13. #13
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    la règle 2 me semble inutile à cause de la règle 1 ?
    En effet...
    Après tout dépend des hypothèses (parents biologiques ou administratifs, homoparentalité, etc)
    Philippe.

  14. #14
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 037
    Points : 40 943
    Points
    40 943
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par Ph. B. Voir le message
    Après tout dépend des hypothèses (parents biologiques ou administratifs, homoparentalité, etc)
    C'est vrai du coup j'ai l'impression d'être vieux jeu
    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

  15. #15
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Ph. B. Voir le message
    Bonjour,

    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 :
    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'))
    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

  16. #16
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 037
    Points : 40 943
    Points
    40 943
    Billets dans le blog
    62
    Par défaut
    Citation Envoyé par maloti Voir le message
    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;
    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.
    Citation Envoyé par Ph.B.
    Cela m'étonnerait que vous l'ayez testée car elle est syntaxiquement incorrecte !
    votre Query est effectivement incorrecte, regardez attentivement ce que vous avez écrit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FROM PERSONNE IN (SELECT
    il manque un WHERE et un nom de champ !
    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 P
    j'ai pas compris quelle est la différence entre ma solution et votre solution!!!
    Pourtant 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)

    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

  17. #17
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Citation Envoyé par SergioMaster Voir le message
    Pourtant 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)
    Courage...

    Citation Envoyé par SergioMaster Voir le message
    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 !
    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 !) :
    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')
    /*)*/
    )
    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)...
    Philippe.

  18. #18
    Invité
    Invité(e)
    Par défaut
    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

  19. #19
    Expert confirmé
    Avatar de Ph. B.
    Homme Profil pro
    Freelance
    Inscrit en
    Avril 2002
    Messages
    1 784
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2002
    Messages : 1 784
    Points : 5 915
    Points
    5 915
    Par défaut
    Citation Envoyé par maloti Voir le message
    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 :

    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.
    1. On vous a déjà dit d'utiliser les balises [CODE] pour présenter vos instructions SQL
    2. 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
    3. Vous ne tenez pas compte de ce qu'on a pu vous expliquer ou présenter précedemment

    Bref :
    1. 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 !
    2. 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.

Discussions similaires

  1. Nombre d'enfants d'un ElementHTLM
    Par gprogEtu dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 28/07/2014, 09h02
  2. Réponses: 11
    Dernier message: 22/09/2010, 14h29
  3. Conseil pour trouver le nombre d'enfant dans un treeview
    Par skunkies dans le forum Windows Forms
    Réponses: 0
    Dernier message: 27/01/2009, 10h50
  4. [SQL2K] Nombre d'adresse d'une personne ?
    Par maitrebn dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 02/01/2007, 16h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo