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 :

Jointure sur table de périodes


Sujet :

Langage SQL

  1. #1
    Membre régulier

    Profil pro
    Laveur
    Inscrit en
    Avril 2004
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Laveur

    Informations forums :
    Inscription : Avril 2004
    Messages : 142
    Points : 81
    Points
    81
    Par défaut Jointure sur table de périodes
    Bonjour,

    J'ai un blocage concernant une requête sql.
    Pourtant elle ne me parait pas compliquée.

    Une table contient des utilisateurs et une autre la période d'activité (les pk sont user & profil).

    Tb1
    User1:profil1:job1
    User1:profil2:job2
    User2:profil1:job3
    User2:profil3:job4

    Tb2
    User1:profil1:10/10/2010:10/10/2011
    User1:profil2:15/09/2010:15/09/2015

    Je devrais avoir en résultat d'une requête qui me retourne les users actifs selon la sysdate :

    User1:profil2:job2
    User2:profil1:job3
    User2:profil3:job4

    J'ai beau chercher, je ne trouve pas la manière la plus simple.

    Merci de votre aide

  2. #2
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 146
    Points : 1 412
    Points
    1 412
    Par défaut
    En dehors d'un petit problème de modélisation !


    La solution passe par les jointures, regardez ce cours, et envoyez la requête que vous proposez (si elle ne répond pas à vos attente).

    Et soyez un tout petit plus clair sur votre besoin, notamment sur la partie WHERE, svp
    Merci d'ajouter un sur les tags qui vous ont aidé

  3. #3
    Membre régulier

    Profil pro
    Laveur
    Inscrit en
    Avril 2004
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Laveur

    Informations forums :
    Inscription : Avril 2004
    Messages : 142
    Points : 81
    Points
    81
    Par défaut
    Bonjour,

    Tout à fait d'accord pour le soucis de modélisation (relation 1<-->1)
    Mais je ne peux pas modifier, je ne suis pas responsable de ces tables

    J'ai tenté ceci avant d'avoir compris que je ne pourrais pas avoir les utilisateurs qui ne sont plus abonnés (tb2) MOINS la liste de tout les autres (tb1)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    select user, profil 
    from tb1 a 
    where a.id not in (
        select b.id 
        from tb2 b 
        where b.debut < SYSDATE 
        and b.fin > SYSDATE 
        and b.profil = ? 
    )

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 032
    Points
    34 032
    Billets dans le blog
    14
    Par défaut
    Je devrais avoir en resultat d une requete qui me retourne les users actif selon la sysdate :

    User1:profil2:job2
    User2:profil1:job3
    User2:profil3:job4
    Qu'est-ce qui justifie la présence, dans le résultat souhaité, des deux dernières lignes alors que User2 ne figure pas dans Tb2 ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 146
    Points : 1 412
    Points
    1 412
    Par défaut
    je n'ai toujours pas compris quelle doit être la sélection (clause WHERE)

    mais pour la jointure, elle devrait être comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT USER,
           Profil
      FROM Tb1 A
        INNER JOIN Tb2 B ON B.Id = A.Id
    WHERE B.Debut < Sysdate
          AND B.Fin > Sysdate
    et j'ai du mal à saisir a quoi correspond les éléments en rouge
    Tb1
    User1:profil1:job1
    User1:profil2:job2
    User2:profil1:job3
    User2:profil3:job4
    Tb2
    User1:profil1:10/10/2010:10/10/2011
    User1:profil2:15/09/2010:15/09/2015
    cela donne l'impression de clé composée ??? pour des sessions multiples d'une même utilisateur. aussi j'ai du mal à comprendre la requête du dessus je la verrais plutôt comme cela ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT USER,
           Profil
      FROM Tb1 A
        INNER JOIN Tb2 B ON B.Id = A.Id and B.profil = A.profil
    WHERE B.Debut < Sysdate
          AND B.Fin > Sysdate
    Merci d'ajouter un sur les tags qui vous ont aidé

  6. #6
    Membre expérimenté
    Avatar de islamov2000
    Homme Profil pro
    Ingénieur d'études & developpement en informatique
    Inscrit en
    Septembre 2007
    Messages
    814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études & developpement en informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2007
    Messages : 814
    Points : 1 717
    Points
    1 717
    Billets dans le blog
    6
    Par défaut
    tu essaies ça
    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
    with Tb1 as
    (
    select 'User1' utilisateur ,'profil1' profile ,'job1' job from dual union 
    select 'User1','profil2','job2' from dual union 
    select 'User2','profil1','job3' from dual union 
    select 'User2','profil3','job4' from dual 
    ),
     
    Tb2 as
    (
    select 'User1' utilisateur ,'profil1' profile ,to_date('10/10/2010','dd/mm/yyyy') date_debut,to_date('10/10/2011','dd/mm/yyyy')date_fin from dual union 
    select 'User1','profil2',to_date('15/09/2010','dd/mm/yyyy'),to_date('15/09/2015','dd/mm/yyyy') from dual
    )
    select * 
    from Tb1 join Tb2 on Tb1.utilisateur =Tb2.utilisateur and Tb1.profile=Tb2.profile
    where sysdate between Tb2.date_debut and Tb2.date_fin
    Bon courage
    d'avoir Pensé à voter positivement pour ceux qui vous ont aidés et surtout à mettre si le cas.
    ça encourage.

  7. #7
    Membre régulier

    Profil pro
    Laveur
    Inscrit en
    Avril 2004
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Laveur

    Informations forums :
    Inscription : Avril 2004
    Messages : 142
    Points : 81
    Points
    81
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Qu'est-ce qui justifie la présence, dans le résultat souhaité, des deux dernières lignes alors que User2 ne figure pas dans Tb2 ?
    On considère que les user qui n'ont pas de date sont actifs

  8. #8
    Membre régulier

    Profil pro
    Laveur
    Inscrit en
    Avril 2004
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Laveur

    Informations forums :
    Inscription : Avril 2004
    Messages : 142
    Points : 81
    Points
    81
    Par défaut
    Citation Envoyé par dehorter olivier Voir le message
    je n'ai toujours pas compris quelle doit être la sélection (clause WHERE)

    mais pour la jointure, elle devrait être comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT USER,
           Profil
      FROM Tb1 A
        INNER JOIN Tb2 B ON B.Id = A.Id
    WHERE B.Debut < Sysdate
          AND B.Fin > Sysdate
    et j'ai du mal à saisir a quoi correspond les éléments en rouge





    cela donne l'impression de clé composée ??? pour des sessions multiples d'une même utilisateur. aussi j'ai du mal à comprendre la requête du dessus je la verrais plutôt comme cela ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT USER,
           Profil
      FROM Tb1 A
        INNER JOIN Tb2 B ON B.Id = A.Id and B.profil = A.profil
    WHERE B.Debut < Sysdate
          AND B.Fin > Sysdate
    Oui effectivement c'est une clé composée. La requête était une tentative de ne retourner que les users sont qui n'ont pas une date en dehors des bornes (donc actif).
    Je pense que les incompréhensions viennent du fait que la table Tb2 ne devrait pas exister dans la mesure où, comme précisé, c'est bien une clé composée qui sont les mêmes dans les deux tables.

Discussions similaires

  1. Réponses: 4
    Dernier message: 21/05/2008, 11h56
  2. Jointures sur table de liaison (n-n) renvoie des doublons
    Par MICHEL_R dans le forum Langage SQL
    Réponses: 5
    Dernier message: 18/04/2008, 14h34
  3. Réponses: 3
    Dernier message: 08/11/2006, 23h04
  4. [FB1.5]Vue avec jointure sur tables ?
    Par Sitting Bull dans le forum SQL
    Réponses: 2
    Dernier message: 07/12/2004, 17h07
  5. jointure sur table et procedure stocké
    Par pram dans le forum SQL
    Réponses: 3
    Dernier message: 18/11/2004, 21h56

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