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

Oracle Discussion :

[SQL][10.g]left join? + algèbre


Sujet :

Oracle

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 24
    Points : 19
    Points
    19
    Par défaut [SQL][10.g]left join? + algèbre
    hello!
    j'ai un petit problème à résoudre, on m'a donné une piste, mais je ne suis pas suffisemment calé pour comprendre la piste...

    soient les deux tables suivantes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    -------------------------       --------------
    |        possede        |       |   motclef  |
    -------------------------       --------------
    | IDElement | IDMotClef |       | ID | nom   |    
    -------------------------       --------------
    |     1     |     3     |       | 1  | ada   |
    |     1     |     2     |       | 2  | uml   |
    |     1     |     4     |       | 3  | paul  |
    |     2     |     3     |       | 4  | henri |
    -------------------------       --------------
    Ce que j'aimerais, c'est un moyen de créer une table m'affichant pour un élément donné (ou l'ensemble des éléments, je suis pas à un select près) si cet élément possède tel mot clef. une réalisation serait:
    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
     
    ---------------------------------- 
    |       briqueJoinMotClef        | 
    ----------------------------------      
    | IDelement| IDMotClef | possede |       
    ----------------------------------      
    |    1     |     1     |  NULL   |     
    |    1     |     2     |   1     |
    |    1     |     3     |   1     |     
    |    1     |     4     |   1     |
    |    2     |     1     |  NULL   |     
    |    2     |     2     |  NULL   |
    |    2     |     3     |   1     |     
    |    2     |     4     |  NULL   |      
    ----------------------------------
    On m'a dit de cherche avec left join, quelque chose du genre:
    LEFT JOIN(element JOIN possede)
    évidemment ce n'est pas du sql valide. J'ai également la requête (assez correcte je pense) sous forme algébrique:




    Quelqu'un peut-il m'aider à débrouiller cela?

    merci beaucoup de votre aide!

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2004
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 25
    Points : 35
    Points
    35
    Par défaut
    Désolé je comprend rien à l'algèbre relationnelle et j'ai pas vu l'intérêt d'une jointure ouverte mais ca devrait le faire:

    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
    40
    41
    42
    43
     
    SQL> select * from possede
      2  ;
     
     IDELEMENT  IDMOTCLEF
    ---------- ----------
             1          3
             1          2
             1          4
             2          3
     
    SQL> select * from motclef
      2  ;
     
            ID NOM
    ---------- ---------------
             1 ada
             2 uml
             3 paul
             4 henri
     
    SQL> SELECT a.idelement AS idbrique, a.id AS idmotclef, TO_NUMBER(NULL) AS possede FROM
      2      (SELECT DISTINCT idelement, id FROM possede, motclef) a, possede p
      3  WHERE p.idelement=a.idelement
      4  AND NOT EXISTS (SELECT NULL FROM possede po
      5                        WHERE po.idelement=p.idelement
      6                        AND po.idmotclef=a.id)
      7  UNION
      8  SELECT p.idelement AS idbrique, p.idmotclef AS idmotclef, 1AS possede FROM possede p
      9  ;
     
      IDBRIQUE  IDMOTCLEF    POSSEDE
    ---------- ---------- ----------
             1          1
             1          2          1
             1          3          1
             1          4          1
             2          1
             2          2
             2          3          1
             2          4
     
    8 ligne(s) sÚlectionnÚe(s).

  3. #3
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Résultat identique à ta demande avec (mais cela ne correspond pas à ta requête algèbrique) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT b.idelement, a.id, Decode (c.idmotclef, NULL, 'NULL', a.Nom) AS Nom
    FROM motclef a cross join (SELECT DISTINCT idelement FROM possede) b
                 left  join possede c ON (a.id = c.idmotclef AND b.idelement = c.idelement)
    ORDER BY b.idelement, a.id
    Idéalement il faudrait remplacer (SELECT DISTINCT idelement FROM possede) par Element si tu as une table des éléments dont le nom est Element
    J'affirme péremptoirement que toute affirmation péremptoire est fausse
    5ième élément : barde-prince des figures de style, duc de la synecdoque
    Je ne réponds jamais aux questions techniques par MP

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 24
    Points : 19
    Points
    19
    Par défaut
    merci mille fois pour vos lumières...
    je dois encore comprendre ce qu'est un cross join j'imagine pour la seconde solution.

    je vais tester les deux et vérifier laquelle est la plus efficace du coup!

    merci encore!

  5. #5
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    CROSS JOIN = produit cartésien.
    J'affirme péremptoirement que toute affirmation péremptoire est fausse
    5ième élément : barde-prince des figures de style, duc de la synecdoque
    Je ne réponds jamais aux questions techniques par MP

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

Discussions similaires

  1. Requete SQL - count dans un left join
    Par JbWillGetYou dans le forum Langage SQL
    Réponses: 7
    Dernier message: 02/06/2010, 01h07
  2. REQUET SQL LEFT JOIN
    Par cLaSic dans le forum Requêtes
    Réponses: 5
    Dernier message: 28/04/2009, 12h38
  3. Probleme LEFT JOIN SQL server avec vb .Net
    Par pilou812 dans le forum VB.NET
    Réponses: 6
    Dernier message: 28/12/2007, 10h40

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