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 :

SELECT depuis une table de liaison entre 2 mêmes tables


Sujet :

Langage SQL

  1. #1
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Points : 8 078
    Points
    8 078
    Par défaut SELECT depuis une table de liaison entre 2 mêmes tables
    Salut à tous

    J'ai une table T_DOSSIERS qui a pour PK un champ DOS_NUM (entier).

    Afin de permettre de lier des dossiers, j'ai créé une table T_DOSSIERS_LIAISONS dans lequel j'ai deux FK: DOS_NUM1 et DOS_NUM2 qui pointent, vous l'aurez compris, sur le DOS_NUM de chaque enregistrement de T_DOSSIERS liés entre eux.
    Un dossier peut être lié à plusieurs autres ou à aucun autre.

    Mon problème est le suivant: j'aurais aimé créer une vue qui m'affiche pour un DOS_NUM défini le dossier qui lui est lié. Le problème c'est que l'on ne sait jamais si c'est DOS_NUM1 ou DOS_NUM2 qui aura la valeur de DOS_NUM. Jusque là, je ne vois absolument pas comment faire.

    J'espère que mes explications sont assez claires

    Des idées?

  2. #2
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Bonjour

    Je pense que une requête dans ce style devrait convenir :

    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
     
    select distinct dos_num, dos_num_lie
    from
    (
    select d.dos_num, 
      case    
        when d.dos_num = l.dos_num1 
          then l.dos_num2
        when d.dos_num = l.dos_num2
         then l.dos_num1
        else null
      end as dos_num_lie
    from t_dossiers d 
    left outer join T_DOSSIERS_LIAISONS l 
      on (l.dos_num1 = d.dos_num  or l.dos_num2 = d.dos_num)
    ) dossiers_lies
    Le select imbriqué est là pour éviter les doublons éventuels; il n'est pas forcémeent indispensable.

  3. #3
    Membre du Club Avatar de Arunna
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Mars 2013
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Mars 2013
    Messages : 34
    Points : 54
    Points
    54
    Par défaut
    Un UNION ALL ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT DOS_NUM1 FROM T_DOSSIERS_LIAISONS  WHERE DOS_NUM1= '....' 
    UNION ALL
    SELECT DOS_NUM2 FROM T_DOSSIERS_LIAISONS  WHERE DOS_NUM2= '....'

  4. #4
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Points : 8 078
    Points
    8 078
    Par défaut
    Merci pour ta réponse

    J'y avais pensé. Seulement, cette requête ne va afficher que la première liaison puisqu'elle est issue de T_DOSSIERS. Comme je l'ai dit, un dossier peut être lié à plusieurs autres.
    S'il y en a plusieurs, ça ne marchera pas ou plutôt ça ne marchera qu'à moitié

    J'avais imaginé que, pour chaque entrée dans T_DOSSIERS_LIAISONS, le SELECT afficherait 2 lignes. L'une avec le premier dossier, l'autre avec le second mais je ne sais pas le faire et je sais encore moins si c'est possible.

    Dans l'idéal, la vue devrait afficher:
    DOS_NUM,
    DOS_NUM_LIE,
    [Autre infos du dossier lié]

  5. #5
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par Arunna Voir le message
    Un UNION ALL ?
    Le problème est qu'il veut mettre cela dans une vue; le doublement de la clause where va donc poser un soucis.

  6. #6
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par Pedro Voir le message
    Merci pour ta réponse

    J'y avais pensé. Seulement, cette requête ne va afficher que la première liaison puisqu'elle est issue de T_DOSSIERS. Comme je l'ai dit, un dossier peut être lié à plusieurs autres.
    Le problème est que on ne voit pas très bien ta demande.

    Veux tu la liste des dossiers liés directement à un dossier (auquel cas la requête que je t'ai passé convient parfaitement) ou une liste des dossiers transitivement liés (A lié à B lié à C) ?

    Merci de préciser. (auquel cas les entrées dans la table liaisons sont uniques pour un dossier donné, mais dans ce cas cette table ne sert pas à grand chose, un champ "liaison" sur la table T_DOSSIER aurait convenu).

  7. #7
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Points : 8 078
    Points
    8 078
    Par défaut
    Merci pour ta réponse
    Citation Envoyé par Arunna Voir le message
    Un UNION ALL ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT DOS_NUM1 FROM T_DOSSIERS_LIAISONS  WHERE DOS_NUM1= '....' 
    UNION ALL
    SELECT DOS_NUM2 FROM T_DOSSIERS_LIAISONS  WHERE DOS_NUM2= '....'
    Je viens d'essayer ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT
      DOS_NUM
    FROM (
      SELECT DOS_NUM1 AS DOS_NUM FROM T_DOSSIERS_LIAISONS  WHERE DOS_NUM1= 1000
      UNION ALL
      SELECT DOS_NUM2 AS DOS_NUM FROM T_DOSSIERS_LIAISONS  WHERE DOS_NUM2= 1000
    )
    Et ça me renvoie invariablement 1000... Je ne sais pas si je m'y suis bien pris. Ce UNION ALL est assez obscur pour moi...
    Pour la petite histoire, dans mes données, le dossier 1000 est lié au dossier 1001.

  8. #8
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    non, les requêtes proposées vont sortir la liste des dossier liés. Il suffit donc de refaire une jointure sur la table des dossier pour en avoir le détail.

    Si votre critère de recherche est directement un numéro de dossier, inutile de mettre deux fois la table des dossiers, et la requête sera

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT d.* -->mettre les noms de colonne
    FROM T_DOSSIERS_LIAISONS dl
    INNER JOIN t_dossiers  d
      ON ( dl.DOS_NUM1 = '...' AND dl.DOS_NUM2 = d.DOS_NUM)
      OR ( dl.DOS_NUM2 = '...' AND dl.DOS_NUM1 = d.DOS_NUM)

  9. #9
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Citation Envoyé par Pedro Voir le message
    Merci pour ta réponse

    Je viens d'essayer ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT
      DOS_NUM
    FROM (
      SELECT DOS_NUM1 AS DOS_NUM FROM T_DOSSIERS_LIAISONS  WHERE DOS_NUM1= 1000
      UNION ALL
      SELECT DOS_NUM2 AS DOS_NUM FROM T_DOSSIERS_LIAISONS  WHERE DOS_NUM2= 1000
    )
    Et ça me renvoie invariablement 1000... Je ne sais pas si je m'y suis bien pris. Ce UNION ALL est assez obscur pour moi...
    Pour la petite histoire, dans mes données, le dossier 1000 est lié au dossier 1001.
    Dans ce cas, ce serait plutôt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT
      DOS_NUM
    FROM (
      SELECT DOS_NUM2 AS DOS_NUM FROM T_DOSSIERS_LIAISONS  WHERE DOS_NUM1= 1000
      UNION ALL
      SELECT DOS_NUM1 AS DOS_NUM FROM T_DOSSIERS_LIAISONS  WHERE DOS_NUM2= 1000
    )

  10. #10
    Rédacteur
    Avatar de Pedro
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    5 411
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 5 411
    Points : 8 078
    Points
    8 078
    Par défaut
    Oups, chuis vraiment désolé mais la requête de Bluedeep fonctionne parfaitement effectivement...

    Et désolé pour mes explications mais sur un schéma c'est simplissime mais à expliquer c'est l'enfer...

    Merci à vous

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Oracle] Le select depuis une vue est différente d'une table ?
    Par sami_c dans le forum PHP & Base de données
    Réponses: 0
    Dernier message: 14/03/2010, 22h06
  2. Réponses: 13
    Dernier message: 22/08/2009, 15h53
  3. Liaison entre Access et tables Oracle
    Par lerico dans le forum Modélisation
    Réponses: 1
    Dernier message: 05/09/2008, 15h35
  4. Selection depuis une cellule active
    Par moilou2 dans le forum Macros et VBA Excel
    Réponses: 25
    Dernier message: 18/02/2008, 14h39
  5. Réponses: 5
    Dernier message: 25/04/2007, 11h34

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