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

Langage SQL Discussion :

Requête pour association réflexive


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Nerva
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    413
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 413
    Par défaut Requête pour association réflexive
    Bonjour.

    Soit une population d'individus. Il y a les internes, qui font partie d'un organisme (société, entreprise, administration, c'est sans importance) et les externes, qui sont des vacataires en partenariat avec des internes pour des missions temporaires.

    - 1 interne peut avoir 0 ou 1 externe à la fois. Une date de début et de fin sont précisées à cet effet.
    - 1 externe (qui n'existe que si il est missionné au moins 1 fois) peut être en partenariat avec 1 ou plusieurs internes, simultanément.

    Voici la structure et un petit jeu de données :

    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
    CREATE TABLE T_INDIVIDUS (
    	IND_ID INTEGER GENERATED BY DEFAULT AS IDENTITY,
    	IND_NOM VARCHAR (50) NOT NULL,
    	IND_PRENOM VARCHAR (50) NOT NULL,
    	CONSTRAINT PK_IND_ID PRIMARY KEY (IND_ID)
    );
     
    CREATE TABLE T_PARTENARIATS (
    	IND_INT_ID INTEGER,
    	IND_EXT_ID INTEGER NOT NULL,
    	PAR_DATE_DEB DATE,
    	PAR_DATE_FIN DATE,
    	CONSTRAINT PK_IND_PAR PRIMARY KEY (IND_INT_ID, PAR_DATE_DEB),
    	CONSTRAINT FK_IND_INT_ID FOREIGN KEY (IND_INT_ID) REFERENCES T_INDIVIDUS (IND_ID),
    	CONSTRAINT FK_IND_EXT_ID FOREIGN KEY (IND_EXT_ID) REFERENCES T_INDIVIDUS (IND_ID)
    );
     
    INSERT INTO T_INDIVIDUS (IND_ID, IND_NOM, IND_PRENOM) VALUES (1, 'Talbot', 'Maribelle');
    INSERT INTO T_INDIVIDUS (IND_ID, IND_NOM, IND_PRENOM) VALUES (2, 'Vidal', 'Pierre');
    INSERT INTO T_INDIVIDUS (IND_ID, IND_NOM, IND_PRENOM) VALUES (3, 'Nemours', 'Doralice');
    INSERT INTO T_INDIVIDUS (IND_ID, IND_NOM, IND_PRENOM) VALUES (4, 'Grimaud', 'Sarah');
    INSERT INTO T_INDIVIDUS (IND_ID, IND_NOM, IND_PRENOM) VALUES (5, 'Vassent', 'David');
    INSERT INTO T_INDIVIDUS (IND_ID, IND_NOM, IND_PRENOM) VALUES (6, 'Carpentier', 'Thomas');
    INSERT INTO T_INDIVIDUS (IND_ID, IND_NOM, IND_PRENOM) VALUES (7, 'Lefort', 'Julie');
    INSERT INTO T_INDIVIDUS (IND_ID, IND_NOM, IND_PRENOM) VALUES (8, 'Jodel', 'Karine');
    INSERT INTO T_INDIVIDUS (IND_ID, IND_NOM, IND_PRENOM) VALUES (9, 'Montepin', 'Victor');
    INSERT INTO T_INDIVIDUS (IND_ID, IND_NOM, IND_PRENOM) VALUES (10, 'Lasalle', 'Anne-Marie');
     
    INSERT INTO T_PARTENARIATS (IND_INT_ID, IND_EXT_ID, PAR_DATE_DEB, PAR_DATE_FIN) VALUES (1, 5, '2025-02-15', '2025-03-07');
    INSERT INTO T_PARTENARIATS (IND_INT_ID, IND_EXT_ID, PAR_DATE_DEB, PAR_DATE_FIN) VALUES (7, 8, '2025-03-27', NULL);
    INSERT INTO T_PARTENARIATS (IND_INT_ID, IND_EXT_ID, PAR_DATE_DEB, PAR_DATE_FIN) VALUES (2, 10, '2025-04-02', '2025-04-29');
    INSERT INTO T_PARTENARIATS (IND_INT_ID, IND_EXT_ID, PAR_DATE_DEB, PAR_DATE_FIN) VALUES (6, 10, '2025-04-18', '2025-04-24');
    INSERT INTO T_PARTENARIATS (IND_INT_ID, IND_EXT_ID, PAR_DATE_DEB, PAR_DATE_FIN) VALUES (6, 8, '2025-04-30', NULL);
    Je pense que la structure est correcte (association réflexive) mais je n'en suis pas certain.

    Ce sujet porte sur une chose que je ne parviens pas à faire : une requête, qui affiche le nom des internes et de leurs externes, uniquement pour les partenariats en cours (date de fin NULL). Soit pour ce jeu de données :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    | IND_INTERNE       | IND_EXTERNE  | PAR_DATE_DEBUT |
    | ----------------- | ------------ | -------------- |
    | Lefort Julie      | Jodel Karine | 2025-03-27     |
    | Carpentier Thomas | Jodel Karine | 2025-04-30     |
    Merci.

  2. #2
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 434
    Par défaut
    Bonjour,
    Comme la table T_INDIVIDUS doit apparaître 2 fois dans la requête, il faut utilise des alias.
    Peux-tu nous montrer ce que tu as tenté ?

    Tatayo.

    P.S. par "convention" les noms de table sont au singulier, on se doute bien qu'il y a plusieurs individus et plusieurs partenariats dans la base

  3. #3
    Membre éclairé Avatar de Nerva
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    413
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 413
    Par défaut
    Je ne suis pas allé bien loin puisque selon la structure et ce que j'imagine être du bon sens, il faut, récupérer le nom d'un interne en référence à son ID et aligner dans la colonne d'à côté le nom d'un externe dont l'ID est différent.

  4. #4
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 434
    Par défaut
    Je ne vois pas trop où est la difficulté: il faut faire 2 jointures sur la table T_INDIVIDUS, comme je l'indiquais dans ma première réponse:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT t1.IND_NOM,t2.IND_NOM,T_PARTENARIATS.PAR_DATE_DEBUT
    from T_PARTENARIATS
    inner join  T_INDIVIDUS as t1
    	ON T1.IND_ID = T_PARTENARIATS.IND_INT_ID
    inner join  T_INDIVIDUS as t2
    	ON T1.IND_ID = T_PARTENARIATS.IND_EXT_ID
    where T_PARTENARIATS.PAR_DATE_FIN is null

    Tatayo.

  5. #5
    Membre éclairé Avatar de Nerva
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    413
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 413
    Par défaut
    C'est un exemple typique où le surnommage des tables est obligatoire ? Je n'ai dû l'utiliser qu'une seule fois...

    Alors la requête fonctionne mais ne retourne rien...

    Edit : il y avait une petite erreur dans l'avant-dernière ligne : T1 à la place de T2. Là c'est ok...

  6. #6
    Expert confirmé
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 434
    Par défaut
    Pour ma part j'utilise les alias quasiment systématiquement, ainsi quand j'ajoute une jointure sur une table qui est déjà dans la requête, je n'ai pas de mauvaise surprises.

    Et puis la plupart du temps ça rend la requête un peu plus lisible.

    Tatayo.

  7. #7
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 604
    Billets dans le blog
    10
    Par défaut
    Bonsoir Nerva, bonsoir à tous

    C'est une très bonne chose de présenter les règles de gestion, car la bonne modélisation en dépend. Bravo

    Le modèle tabulaire est correct, les deux tables sont bien requises, mais attention toutefois, vu que la table associative a pour PK l'identifiant de l'individu interne et la date de début il est possible d'enfreindre la règle de gestion 1 avec le type de cas suivant :

    Id interne : 1    date début : 01-04-2025    date de fin 31-12-2025
    Id interne : 1    date début : 02-04-2025    date de fin 31-12-2025

    Comme les dates de début diffèrent, l'unicité de la PK est respectée, mais pas la règle de gestion 1
    Il faudra donc contrôler grâce une UDF associée à une contrainte CHECK ou grâce à un trigger qu'on n'enfreint pas cette règle

Discussions similaires

  1. [Bénévole] webmaster pour association
    Par as.sc.fr dans le forum Autres
    Réponses: 0
    Dernier message: 26/01/2008, 13h43
  2. Une boucle pour associer X actions à X checkbox
    Par nicolas2603 dans le forum ActionScript 1 & ActionScript 2
    Réponses: 1
    Dernier message: 17/10/2007, 14h05
  3. Besoin petite aide pour association
    Par ptityop dans le forum Autres
    Réponses: 0
    Dernier message: 09/10/2007, 16h23
  4. pb pour associé un fichier chm avec un projet MFC
    Par Cédric_07 dans le forum MFC
    Réponses: 9
    Dernier message: 05/12/2006, 15h56
  5. Réponses: 2
    Dernier message: 26/07/2006, 12h46

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