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 :

[Oracle] jointure et sous requete


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Inscrit en
    Juin 2005
    Messages
    150
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 150
    Points : 93
    Points
    93
    Par défaut [Oracle] jointure et sous requete
    bonjour,

    je concois que la question ait pu etre posee plusieurs fois, mais je bloque vraiment ave un probleme de jointure.

    je suis sous oracle et j'ai trois tables contenant chacunes diverses informations sur un document.

    j'essaye de recuperer toutes ces informations, avec les deux premieres tables pas de problemes :

    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
     
    select                    dnod.ID
       		 , dnod.TITLE
    		 , dnod.URL
    		 , dnod.ISPARENT
    		 , dnod.DTYP_CODE
     
    		 , ddet.DNOD_ID
    		 , ddet.REVISION_DATE
    		 , ddet.REVISION_NUMBER
    		 , ddet.DOCUMENT_NUMBER
    		 , ddet.DOCUMENT_KEYWORDS
    		 , ddet.DSTA_CODE
     
          from pns_document_nodes dnod
    	  join pns_document_details ddet on dnod.id = ddet.dnod_id	
    	  where dnod.id = p_id_input
    seulement voila , la troisieme table concerne les createurs de documents, c'est a dire qu'un document peut avoir ete cree par plusieurs personnes

    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
     
    exemple :
     
    dnod_id | down_id | ordreCreateur
    -----------------------------
    Doc1    | Crea1     | o1
    -----------------------------
    Doc2    | Crea1     | o1
    -----------------------------
    Doc3    | Crea4     | o1
    -----------------------------
    Doc2    | Crea4     | o2
    -----------------------------
    Doc4  | Crea2 | o1
    -----------------------------
    je pensais donc utiliser une sous requete afin de recuperer tous les id des createurs pour un document donne :
    [CODE]
    select * from
    ( select down_id from pns_owner_related_to_documents
    where dnod_id = p_id_input order by owner_order)
    [CODE]

    mais je n'arrive vraiment pas a combiner les deux. j'ai essayer plusieurs syntaxes mais rien n'y fait .
    si quelqu'un pouvait m'aiguiller parce que la je galere vraiment.
    en esperant ne pas avoir ete trop confus dans mes explications

    merci d'avance pour votre aide

  2. #2
    Membre éclairé Avatar de LeXo
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 147
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 147
    Points : 868
    Points
    868
    Par défaut han han
    il faut rassembler tes tables en faisant coincider tes clés qui les relies

    donnes la structure de tes tables et ce que tu veux recup
    Plzzz pas de questions par MP.

  3. #3
    Membre régulier
    Inscrit en
    Juin 2005
    Messages
    150
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 150
    Points : 93
    Points
    93
    Par défaut
    re,
    merci pour ta reponse.

    voici les tables utilisees :

    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
    36
    37
    38
    39
     
    table pns_document_nodes
    --------------------------
      ID         NUMBER,
      TITLE      VARCHAR2(200 BYTE),
      DTYP_CODE  NUMBER,
      URL        VARCHAR2(100 BYTE),
      ISPARENT   VARCHAR2(1 BYTE)
     
    ********************************
     
    table pns_document_details
    --------------------------
      DNOD_ID           NUMBER,
      DOCUMENT_NUMBER    VARCHAR2(20 BYTE),
      REVISION_DATE        DATE,
      REVISION_NUMBER    VARCHAR2(2 BYTE),
      DSTA_CODE          VARCHAR2(1 BYTE),
      DOCUMENT_KEYWORDS  VARCHAR2(200 BYTE)
     
      CONSTRAINT FK_DNOD_ID FOREIGN KEY (DNOD_ID) 
        REFERENCES PNS_DOCUMENT_NODES (ID)
     
      CONSTRAINT FK_DSTA_CODE FOREIGN KEY (DSTA_CODE) 
        REFERENCES PNS_DOCUMENT_STATUSES (CODE)
     
    ***************************************
     
    table pns_owner_related_documents
    ----------------------------------
      DOWN_ID      NUMBER,
      DNOD_ID      NUMBER,
      OWNER_ORDER  VARCHAR2(3 BYTE)
     
      CONSTRAINT FK_DOWN_ID FOREIGN KEY (DOWN_ID) 
        REFERENCES PNS_DOCUMENT_OWNERS (ID)
     
      CONSTRAINT FK_ORTDOC_DNOD_ID FOREIGN KEY (DNOD_ID) 
        REFERENCES PNS_DOCUMENT_NODES (ID)
    en fait je voudrais tout recuperer. et donc j'arrive a le faire avec les deux premieres mais je coince avec la troisieme. un document peut avoir 1 a 3 createurs. je pensais que la sous requete me permettrait d'avoir une liste de tous les createurs relatifs a un document donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    select * from 
    ( select down_id from pns_owner_related_to_documents
    where dnod_id = p_id_input order by owner_order)
    mais je n'arrive a la joindre avec la premiere

    merci encore pour votre aide

  4. #4
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    J'imagine que pour chaque ouvrage, tu souhaites avoir la liste des auteurs sur la même ligne ?

    S oui, c'est assez compliqué en fait (et pas forcément supporté par tous les SGBD) : Si tu veux faire cela en SQL, il va falloir que tu t'inspires de cet exemple : http://www.developpez.net/forums/sho...5&postcount=30

    Sinon, une jointure classique te permettra de t'en tirer : tu auras autant de lignes que d'auteurs par document, mais tu t'occupes des ruptures/du formattage dans l'interface et pas dans le SGBD. C'est en général ainsi qu'il est conseillé de procéder pour des raisons de performances et de simplicité/lisibilité du code.
    "Ce que l'on conçoit bien s'énonce clairement,
    Et les mots pour le dire arrivent aisément." Nicolas Boileau

    "Expliquer empêche de comprendre si cela dispense de chercher"

    Quiz Oracle : venez tester vos connaissances !

    La FAQ Oracle : 138 réponses à vos questions
    Aidez-nous à la compléter

  5. #5
    Membre régulier
    Inscrit en
    Juin 2005
    Messages
    150
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 150
    Points : 93
    Points
    93
    Par défaut
    re,

    merci pour ta reponse.

    n'etant pas tres cale en sql ( ca ne fait pas tres longtemps que j'ai commence ), est ce que tu pourrais m'en dire plus sur la jointure classique, est ce que je peux garder les requetes telles quelles ou bien faut il que je les changes?
    parce que ce n'est pas un probleme si j'ai autant de lignes que d'auteurs mais malheureusement je n'ai pas reussi a regrouper les deux...

    merci encore pour votre aide et votre patience

  6. #6
    Membre régulier
    Inscrit en
    Juin 2005
    Messages
    150
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 150
    Points : 93
    Points
    93
    Par défaut
    re,

    effectivement avec le lien que tu viens de me donner, j'obtiens ce que je veux a savoir :

    idDoc | idOwners
    ----------------
    1 | 1
    ---------------
    2 | 2,3
    ---------------
    3 | 1,2,3

    ca le fait, bon le seul probleme est de reellement savoir ce que l'on fait et pour le moment a part avoir changer les noms, je ne suis pas sur d'avoir compris la manoeuvre
    bon ce n'est pas forcement un soucis, je pense que je peux trouver des informations m'expliquant les etapes de cette requete.

    par contre je suis toujours partant pour l'autre possibilite dont tu me parlais a savoir la jointure simple si c'est toujours possible, peut etre que je comprendrais un peu mieux ...

    en tous les cas merci pour ton aide

  7. #7
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    La requête "simple" ressemblerait à cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT dnod.ID, dnod.TITLE, dnod.URL, dnod.ISPARENT, 
           dnod.DTYP_CODE, ddet.DNOD_ID, ddet.REVISION_DATE, 
           ddet.REVISION_NUMBER, ddet.DOCUMENT_NUMBER, 
           ddet.DOCUMENT_KEYWORDS, ddet.DSTA_CODE,
           own.down_id, own.owner_order
      FROM pns_document_nodes dnod INNER JOIN pns_document_details ddet ON dnod.id = ddet.dnod_id    
                                   INNER JOIN pns_owner_related_documents own ON own.dnod_id = dnod.id
     WHERE dnod.id = p_id_input
    Ici, j'ai repris ta requête de départ et ai rajouté la jointure avec la table pns_owner_related_documents que j'ai aliassé "own", et j'ai rajouté les champs de cette table dans le SELECT.
    "Ce que l'on conçoit bien s'énonce clairement,
    Et les mots pour le dire arrivent aisément." Nicolas Boileau

    "Expliquer empêche de comprendre si cela dispense de chercher"

    Quiz Oracle : venez tester vos connaissances !

    La FAQ Oracle : 138 réponses à vos questions
    Aidez-nous à la compléter

  8. #8
    Membre régulier
    Inscrit en
    Juin 2005
    Messages
    150
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 150
    Points : 93
    Points
    93
    Par défaut
    bonjour,

    merci pour ta reponse, cela resoud mon probleme. en plus effectivement, je comprends mieux cette solution que la precedente. si en plus, au niveau performances, elle est preferable, autant faire les choses le mieux possible.

    je vais me documenter un peu plus sur le sujet.

    en tous les cas encore une fois merci pour ton aide.

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

Discussions similaires

  1. jointure et sous-requetes ?
    Par somasimple dans le forum Requêtes
    Réponses: 11
    Dernier message: 20/07/2011, 10h59
  2. requête jointure et sous requete
    Par wang_xue dans le forum Langage SQL
    Réponses: 3
    Dernier message: 31/10/2007, 10h21
  3. Réponses: 15
    Dernier message: 14/04/2006, 15h34
  4. jointure gauche sous oracle
    Par allowen dans le forum Langage SQL
    Réponses: 7
    Dernier message: 12/05/2005, 10h42
  5. [ORACLE][SQL] procedure sous delphi avec une requete SQL
    Par nivet dans le forum Bases de données
    Réponses: 2
    Dernier message: 17/11/2004, 13h43

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