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

SQL Oracle Discussion :

Jointure externe / cardinalité


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 8
    Par défaut Jointure externe / cardinalité
    Bonjour

    J'ai la table suivante : Dictionnaire avec les champs suivant mot et definition.

    Cette table contient les lignes :
    Artiste;Definition 1 de artiste
    Artiste;Definition 3 de artiste
    Artiste;Definition 2 de artiste
    Diplome;Definition 1 du mot diplome

    Je souhaite en résultat un table
    MOT, DEFINITION, DEFINITION, DEFINITION

    Je fais donc une double auto jointure externe sur mot et rowid

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Select d1.mot, d1.definition, d2.definition, d3.definition
    From dictionnaire d1 
      left outer join dictionnaire d2 on d1.mot=d2.mot and d1.rowid!=d2.rowid
      left outer join dictionnaire d3 on d2.mot=d3.mot and d2.rowid!=d3.rowid

    Mon soucis, est que le resultat comporte 13 lignes
    12 Artiste
    1 Diplome

    Comment ne garder qu'une seul ligne pour Artiste ?

    Merci d'avance pour vos conseils.

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    C'est de l'Oracle ?

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 8
    Par défaut
    Merci pour la remise en forme avec la balise CODE.

    Oui c'est en effet une requête Oracle, ca veux dire qu'il y a une solution simple ?
    Ou dois je partir vers une sous-requête avec un group by sur mot et la sélection du min (rowid) ?

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Pas besoin de jointure en effet, il suffit de faire un pivot :
    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
    WITH DICTIONNAIRE AS
    (
    SELECT 'Artiste' AS MOT, 'Definition 1 de artiste' AS DEFINITION FROM DUAL UNION ALL
    SELECT 'Artiste'       , 'Definition 3 de artiste'               FROM DUAL UNION ALL
    SELECT 'Artiste'       , 'Definition 2 de artiste'               FROM DUAL UNION ALL
    SELECT 'Diplome'       , 'Definition 1 du mot diplome'           FROM DUAL
    )
      ,  SR AS
    (
    SELECT MOT, DEFINITION,
           ROW_NUMBER() OVER(PARTITION BY MOT ORDER BY DEFINITION ASC) AS RN
      FROM DICTIONNAIRE
    )
      SELECT MOT, 
             MAX(CASE RN WHEN 1 THEN DEFINITION END) AS D1,
             MAX(CASE RN WHEN 2 THEN DEFINITION END) AS D2,
             MAX(CASE RN WHEN 3 THEN DEFINITION END) AS D3
        FROM SR
    GROUP BY MOT
    ORDER BY MOT ASC;
     
    MOT	D1				D2			D3
    Artiste	Definition 1 de artiste		Definition 2 de artiste	Definition 3 de artiste
    Diplome	Definition 1 du mot diplome

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Février 2010
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 8
    Par défaut
    Bonjour et merci pour la réponse qui fonctionne a merveille, ne connaissant pas le pivot (je vais me renseigner dessus car c'est vrai que passer des colonnes en lignes c'est souvent pratique), mais y a t il moyen de faire avec une jointure ?

    Je n'arrive pas a faire mieux que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    select d1.mot, d1.def, d2.def, d3.def
      from dic d1 
           left outer join dic d2 on d1.mot=d2.mot and d1.rowid!=d2.rowid
           left outer join dic d3 on d2.mot=d3.mot and d1.rowid!=d3.rowid and d3.rowid!=d2.rowid
    where (d1.mot,d1.rowid) in 
    ( select d1.mot, min(d1.rowid)
      from dic d1 
           left outer join dic d2 on d1.mot=d2.mot and d1.rowid!=d2.rowid
           left outer join dic d3 on d2.mot=d3.mot and d1.rowid!=d3.rowid and d3.rowid!=d2.rowid  group by d1.mot
    );
    Ce qui donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    MOT        DEF        DEF        DEF
    ---------- ---------- ---------- ----------
    maison     sens 1     sens 3     sens 2
    maison     sens 1     sens 2     sens 3
    ami        sens 2
    Des idées pour supprimer ce doublon ?

    Merci d'avance

  6. #6
    Membre éclairé Avatar de rvfranck
    Profil pro
    Étudiant
    Inscrit en
    Novembre 2004
    Messages
    746
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2004
    Messages : 746
    Par défaut
    Si pour toi, le doublon c'est juste le champ maison (plutot la ligne en entier), ceci pourrait t'aider.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT DISTINCT d1.mot, d1.def, d2.def, d3.def

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

Discussions similaires

  1. [CR9] faire une Jointure externe
    Par coldec dans le forum SAP Crystal Reports
    Réponses: 5
    Dernier message: 28/06/2005, 12h10
  2. Jointure externe compliquée
    Par miniil dans le forum Langage SQL
    Réponses: 9
    Dernier message: 19/02/2004, 09h27
  3. Jointure externe qui ne fonctionne pas
    Par Guizz dans le forum Langage SQL
    Réponses: 3
    Dernier message: 05/02/2004, 12h26
  4. [ jointure externe ] j'y pompe rien
    Par jaimepasteevy dans le forum Langage SQL
    Réponses: 3
    Dernier message: 16/12/2003, 17h57
  5. [Interbase] [Triggers] jointure externe
    Par AnestheziE dans le forum InterBase
    Réponses: 9
    Dernier message: 17/11/2003, 16h17

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