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 :

[10g] Fusionner des valeurs de champs


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Novembre 2004
    Messages
    469
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 469
    Par défaut [10g] Fusionner des valeurs de champs
    Bonjour à tous,

    J'ai deux tables :
    - une table principale avec une clé et un libelle
    - une ou des tables secondaires avec des clés et des champs et dans lesquelles j'ai en fk la clé de ma table principale

    Est il possible de réaliser une vue qui me ramène (concaténation) dans un seul champ la valeur des libellés des tables secondaires pour un fk.


    Exemple:

    cle1DeLaTablePrincipale | champ fusion table secondaire 1
    1 | valeur1champ1tbs1fk1 + valeur2champ1tbs1fk1 + valeur3champ1tbs1fk1


    Merci pour vos réponses car j'ai pas trouvé ...

    Encore une question
    Avez vous une doc précise sur le WITH ?

    Merci

  2. #2
    Membre éclairé
    Inscrit en
    Juillet 2006
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 76

  3. #3
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    Citation Envoyé par lenoil Voir le message
    cle1DeLaTablePrincipale | champ fusion table secondaire 1
    1 | valeur1champ1tbs1fk1 + valeur2champ1tbs1fk1 + valeur3champ1tbs1fk1
    Avec une version récente, style 11gR2, tu peux faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT p, LISTAGG(s,' + ') within group (order by s) FROM T group by p
    Dans 10g, tu peux tenter COLLECT

    Ex:
    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
    CREATE OR REPLACE FUNCTION f(
       strings     SYS.odcivarchar2list,
       separator   VARCHAR2 DEFAULT ','
    )   RETURN VARCHAR2 IS
       str   VARCHAR2 (4000);
    BEGIN
       FOR f IN strings.FIRST .. strings.LAST LOOP
          str := str || strings (f);
          IF (f != strings.LAST) THEN
             str := str || separator;
          END IF;
       END LOOP;
       RETURN str;
    END;
    /
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT   deptno, f(CAST (COLLECT (ename) AS SYS.odcivarchar2list))
        FROM emp
    GROUP BY deptno;
     
      DEPTNO F(CAST(COLLECT(ENAME)ASSYS.ODCIVARCHAR2LIST))
    -------- ------------------------------------------------------
          10 KING,CLARK,MILLER
          20 JONES,ADAMS,SCOTT,SMITH,FORD
          30 BLAKE,ALLEN,WARD,JAMES,TURNER,MARTIN

  4. #4
    Membre éclairé
    Inscrit en
    Juillet 2006
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 76
    Par défaut
    Je n'ai peut etre pas compris la question au vue de la reponse apporté par laurentschneider. Je vais qd meme mettre ce que j'avais fais.

    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
    --drop table Maitre;
    --drop table Fils1;
    --drop table Fils2;
     
    CREATE TABLE Maitre as
    (SELECT level as maitre_pk,DBMS_RANDOM.STRING('A', 10) as libelle
    FROM dual
    connect BY level <= 55);
     
    CREATE TABLE Fils1 as
    (
    SELECT maitre_pk as fils1_pk,maitre_pk as maitre_fk,
    DBMS_RANDOM.STRING('A', 10) as libelle
    FROM Maitre
    );
     
    CREATE TABLE Fils2 as
    (SELECT maitre_pk+1 as fils2_pk,maitre_pk as maitre_fk,
     DBMS_RANDOM.STRING('A', 10) as libelle
    FROM Maitre);
     
    analyze table Maitre compute statistics;
    analyze table Fils1 compute statistics;
    analyze table Fils2 compute statistics;
     
    --drop view viewtest;
     
    create view viewtest as (
    select
    m.maitre_pk as viewtest_pk,
    nvl(f1.libelle,'')||''||nvl(f2.libelle,'') as fils
    from Maitre m
         JOIN Fils1 f1 ON m.maitre_pk=f1.maitre_fk
                JOIN Fils2 f2 ON m.maitre_pk=f2.maitre_fk);
     
     
    select * from viewtest
    where viewtest_pk = 25

  5. #5
    Membre éclairé
    Inscrit en
    Novembre 2004
    Messages
    469
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 469
    Par défaut
    OUAH merci pour cette réponse

    Je vais regarder tout ceci car il faut que je comprennes tout ça et que je le digère

    Merci en tout cas car j'aurais pas trouvé .... ou difficilement

  6. #6
    Membre expérimenté Avatar de petitfrere
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    259
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 259
    Par défaut
    si c'est juste une fusion

    select champ1 || ' ' || champ2 || ' ' || champ3 from ...

  7. #7
    Membre Expert Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Par défaut
    Salut !

    PetitFrere, Boutade, le problème est que ce n'est pas une concaténation fixe d'un nombre d'éléments connus : il peut y avoir n ligne de la table secondaire à fusionner. C'est un peu comme faire la somme sur un GROUP BY, mais sur des chaînes de caractères.

    Allez, un truc qui marche avant 10g :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT p, RTRIM(REPLACE(REPLACE(XMLAgg(XMLElement("x", s)), '<x>', ' '), '</x>', ','), ',') as Agg
    FROM T 
    GROUP BY p
    (Attention, sous 10g, ça ne marche pas quand on essaie de concaténer des ♥ chr(3) )

    Puis tiens, je me suis tellement fait chier dans la vie à faire ça avec du sys_connect_by_path que j'ai décidé de remercier Waldar à chaque fois que j'utiliserais ces fonctions.

    @laurentschneider : j'ai vraiment jubilé quand j'ai vu LISTAGG : enfin !
    (reste plus qu'à passer en 11...)

  8. #8
    Membre éclairé
    Inscrit en
    Novembre 2004
    Messages
    469
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 469
    Par défaut
    resalut à tous et merci pour vos réponses

    J'ai finalement choisi la solution de laurent qui marche nickel avec le COLLECT

    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
    CREATE OR REPLACE FUNCTION f(
       strings     SYS.odcivarchar2list,
       separator   VARCHAR2 DEFAULT ','
    )   RETURN VARCHAR2 IS
       str   VARCHAR2 (4000);
    BEGIN
       FOR f IN strings.FIRST .. strings.LAST LOOP
          str := str || strings (f);
          IF (f != strings.LAST) THEN
             str := str || separator;
          END IF;
       END LOOP;
       RETURN str;
    END;
    /
    Je l'ai modifié un petit peu pour moi.

    Par contre, est-il possible d'avoir la même chose mais avec un résultat dans des colonnes séparées (comme des champs):
    c'est à dire

    DEPTNO VAR1 VAR2 VAR3 VAR4 etc...
    -------- --------- ------- ------ ------
    10 KINGCLARK MILLER
    20 JONES ADAMS SCOTT SMITH
    30 BLAKE ALLEN WARD JAMES TURNER



    Merci pour votre aide car là j'ai du mal ....

Discussions similaires

  1. count sur des valeurs de champs
    Par Braillane dans le forum Langage SQL
    Réponses: 2
    Dernier message: 23/05/2007, 16h27
  2. JSP : recuperation des valeurs de champs d'un formulaire
    Par keumlebarbare dans le forum Servlets/JSP
    Réponses: 4
    Dernier message: 26/01/2007, 10h16
  3. Réponses: 5
    Dernier message: 17/08/2006, 14h45
  4. [Cookies] Conserver des valeurs de champs
    Par Sergejack dans le forum Langage
    Réponses: 4
    Dernier message: 31/07/2006, 11h17
  5. Tri par la moyenne des valeurs de champs ?
    Par rozwel dans le forum Requêtes
    Réponses: 8
    Dernier message: 28/01/2005, 18h35

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