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 :

Requête sur plusieurs tables


Sujet :

SQL Oracle

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 70
    Points : 26
    Points
    26
    Par défaut Requête sur plusieurs tables
    Bonjour,
    POurriez vous m'aider a construire ma requête sur plusieurs table. Le but est d'afficher les produits en attente de facturation, le nom et prenom pour qui ces produits sont en attente de facturation et un commentaire liée à cette attente (si commentaire il y a, car parfois il n'y en a pas). Le souci c'est que ces données sont éparpilllées sur 4 tables.
    La table A contient les factures, la table B le détail des factures
    chaque facture de la table A a un id_facture et plusieurs ligne de la table B peuvent avoir le même id_facture si la facture possède plusieurs ligne.
    Jusque la c'est pas bien compliqué...
    Ce qui met le brun ce sont les commentaires.

    La table C possède 2 colonnes:
    1 colonne avec l'id_facture, et une colonne avec un id_commentaire

    et la table D possède une colonne avec l'ID_COMMENTAIRE et une colonne sous la forme d'un clob vec le contenu du commentaire.

    Donc je voudrais un tableau avec des données de A, B et D et j'ai besoin de C pour faire le lien entre l'id_facture et l'id_commentaire.

    Pour corser le tout, comme il n'y a pas systématiquement un commentaire, on n'a donc pas tous les id_factures présents dans la table C et la table D. l'id_facture n'existe dans C et dans D que si un commentaire a été laissé.
    ET la du coup je sèche complètement.

    Merci a tous pour votre aide

  2. #2
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 138
    Points : 1 918
    Points
    1 918
    Par défaut
    Bonjour,

    Il suffit de faire des jointures externes:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    select a.id_facture,
           b.id_produit,
           d.commentaire
    from table_A a
    join table_B b on b.id_facture = a.id_facture
    left join table_C c on c.id_facture = a.id_facture
    left join table_D d on d.id_commentaire = c.id_commentaire 
    where ...

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 70
    Points : 26
    Points
    26
    Par défaut
    Merci beaucoup !!! ça marche!! Les jointures, je pige rien....
    J'ai encore une petite demande.

    Le contenu du commentaire est un CLOB et est en fait ainsi: <p style="text-align: left;"><font face="'Segoe UI'" size="7">BLABLABLA</font></p>
    Moi ce qui m'intéresse c'est seulement le commentaire et pas toute sa mise en forme

    Y'a t-il moyen d'extraire ça??

    Merci mille fois

  4. #4
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 138
    Points : 1 918
    Points
    1 918
    Par défaut
    Si ton commentaire présente toujours ce pattern alors tu peux essayer la fonction expression régulière regexp_substr:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    regexp_substr(commentaire, '^.+>(.+)</font></p>$', 1, 1, 'i', 1)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    with text as (select '<p style="text-align: left;"><font face="''Segoe UI''" size="7">BLABLABLA</font></p>' t from dual) 
    select regexp_substr(t, '^.+>(.+)</font></p>$', 1, 1, 'i', 1)
    from text;
    BLABLABLA

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 70
    Points : 26
    Points
    26
    Par défaut
    Merci!! J'ai rien compris de comment ça marche même en cherchant dans la doc...
    Mais du coup entre temps je me suis rendu compte que

    si quelqu'un laisse un commentaire avec un espace vide à la fin, ca me sort le commentaire et &nbsp à la fin (à la rigueur pas trop grave)
    mais plus embetant: si quelqu'un laisse un commentaire et met un entrée à la fin

    J'ai du coup un CLOB qui contient <p style="text-align: left;"><font face="'Segoe UI'">BLABLABLA</font></p><p style="text-align: left;"><font face="'Segoe UI'"><br></font></p>

    y'a du coup une deuxième <p style....... et le commentaire tronqué alors ne laisse que <br> et pas la première ligne.

    Y'aurait encore moyen de modifier la formule magique?

    Merci beaucoup d'avance

  6. #6
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 138
    Points : 1 918
    Points
    1 918
    Par défaut
    Bonjour,

    Oui il faut modifier le pattern dans ce cas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    set define off;
    with text as (select '<p style="text-align: left;"><font face="''Segoe UI''" size="7">BLABLABLA</font></p>' t from dual union all
                  select  '<p style="text-align: left;"><font face="''Segoe UI''" size="7">BLABLABLA&nbsp</font></p>' t from dual union all
                  select '<p style="text-align: left;"><font face="''Segoe UI''">BLABLABLA</font></p><p style="text-align: left;"><font face="''Segoe UI''"><br></font></p>' from dual
    ) 
    select replace(regexp_substr(t, '^.+?<font.+>(.+)</font></p>.*$', 1, 1, 'i', 1), '&nbsp')
    from text;
    
    BLABLABLA
    BLABLABLA
    BLABLABLA
    La fonction REGEXP_SUBSTR permet d'extraire une chaine de caractères en fonction d'une expression régulière. On peut même extraire une sous-chaine du pattern en précisant ce que tu veux en parenthèses (ce que j'ai mis en gras). En gros, je cherche le pattern suivant:

    début de chaine (caractère ^) suivi d'un nombre quelconque de caractères jusqu'à la chaine <font. Ensuite je vais jusqu'au chevron fermant. C'est ce qui se trouve entre les chevrons qui m'intéresse. Donc je cherche un nombre quelconque de caractères jusqu'à la chaine </font></p>. Comme ce n'est forcément la dernière chaine de ce type, je précise .*$ pour aller jusque la fin avec éventuellement des caractères quelconques entre 2.
    A noter que j'ai dû précisé ^.+? au début pour avoir un comportement "non-greedy", sinon on allait chercher la dernière balise <font>.

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 70
    Points : 26
    Points
    26
    Par défaut
    Un grand merci pour ton aide. Tu maitrises!!! Ca demande quand même de l'entrainement pour réussier a composer le pattern.
    Est ce qu'il est possible (le mec pas exigeant du tout) que le résultat du regexp sorte sous une forme concaténée du style BLABLA1 BLABLA2 BLABLA3 et non un BLABLA sur chaque ligne??

    Pour replace, il me remplace le &nbsp par un ;
    Dans la formule, je ne comprends pas ou tu spécifies par quoi le &nbsp est remplacé.

    Merci pour ton aide précieuse

  8. #8
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 138
    Points : 1 918
    Points
    1 918
    Par défaut
    Tu as &nbsp; peut-être alors? Dans ce cas précise &nbsp; dans le replace (si tu ne précises rien dans la chaine de remplacement alors c'est null, ce qui revient à "supprimer" la chaine)

    Si tu veux remplacer les retours à la ligne par des espaces alors tu peux faire un 2è replace:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select replace(replace(regexp_substr(t, '^.+?<font.+>(.+)</font></p>.*$', 1, 1, 'i', 1), '&nbsp;'), chr(13), ' ')
    from text;

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 70
    Points : 26
    Points
    26
    Par défaut
    Je rencontre un souci tout de meme avec regexp.
    Je comprends que n'ayant pas la base de données que j'ai, tu simule le clob avec select .....

    Moi quand je tape la requete suivante:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Select
    REPLACE(REPLACE(regexp_substr(A.CONTENU, '^.+?<font.+>(.+)</font></p>.*$', 1, 1, 'i', 1), '&nbsp;'), CHR(13), ' ') AS COMMENTAIRE
    from T_COMMENTAIRE A
    where ID_COMMENTAIRE = 3442
    Ca ne me sort que la première ligne du commentaire c'est à dire commentaire sur

    Pourtant A.CONTENU vaut
    <p style="text-align: left;"><font face="'Segoe UI'">COMMENTAIRE SUR</font></p><p style="text-align: left;"><font face="'Segoe UI'">3</font></p><p style="text-align: left;"><font face="'Segoe UI'">LIGNES</font></p>

    et devrait me sortir alors: commentaire sur 3 lignes.

    Je comprends pas pourquoi. Il met

    COMMENTAIRE SUR
    1 row selected

  10. #10
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 138
    Points : 1 918
    Points
    1 918
    Par défaut
    Ok dans ce cas c'est plus compliqué car tu as plusieurs occurrences du même pattern. Il faut utiliser une backreference pour trouver ces occurrences. Tu peux essayer ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Select
    regexp_replace(regexp_replace(regexp_replace(replace(A.CONTENU,'&nbsp;'), '^.*?>(.+)</font>.*$', '\1'), '<.+?>', ' '), '[[:space:]]+', ' ') AS COMMENTAIRE
    from T_COMMENTAIRE A
    where ID_COMMENTAIRE = 3442
    Le premier rexexp_replace recherche ce qui se trouve entre ">(.+)</font>" et utilise ce qui est trouvé en backreference (le \1 dans la chaine de remplacement). Le deuxième regexp_replace sert à remplacer se qui se trouve à l'intérieur des chevrons par un espace (on peut pas mettre NULL sinon tes morceaux de commentaire seraient collés), et enfin le dernier regexp_replace sert à remplacer plusieurs espaces par un seul.

  11. #11
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 70
    Points : 26
    Points
    26
    Par défaut
    Tu es un dieu!!!!
    C'est nickel ça marche.

    En revanche pour ma culture, tu écris regexp( .....' i' , 1)

    Sur internet je trouve nulle part d'info sur l'utilité du dernier paramètre 1 après i qui sert au insensitive case.

    Encore merci pour ton aide

  12. #12
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 138
    Points : 1 918
    Points
    1 918
    Par défaut
    En fait le 1 en dernier et le paramètre de sous-chaine. Il sert à extraire une partie du pattern, que tu mets alors entre parenthèses.

Discussions similaires

  1. suite au problème de requête sur plusieur table
    Par michelGProuq dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 07/07/2006, 16h19
  2. [VB6] RecordSet, Oracle, requête sur plusieurs Tables
    Par pier* dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 13/04/2006, 10h19
  3. Requête sur plusieurs tables
    Par sta_schmitt dans le forum Requêtes
    Réponses: 2
    Dernier message: 28/03/2006, 13h54
  4. Requéte sur plusieurs tables
    Par polux23 dans le forum Requêtes
    Réponses: 11
    Dernier message: 23/02/2006, 23h00
  5. Requête sur plusieurs tables
    Par drinkmilk dans le forum Langage SQL
    Réponses: 8
    Dernier message: 11/07/2005, 12h25

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