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 :

Faire un Select particulier


Sujet :

SQL Oracle

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2008
    Messages : 21
    Points : 9
    Points
    9
    Par défaut Faire un Select particulier
    Bonsoir,

    Je voudrais faire un select un peu particulier.
    Immaginons que j'ai une table comme ceci

    [CODE]
    CREATE TABLE TABLE_1
    (
    idT1 number(10, 0) primary key,
    nom varchar2(100) not null,
    prenom varchar2(100) not null,
    ...
    );
    [CODE]

    J'ai une seconde table qui a une clé étrangère vers la Table_1 comme ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    CREATE TABLE TABLE_2 
    (
       ...
       idT1 number(10, 0), 
       ...
       typetel varchar2(20),
       numtel varchar2(20)
    ...  
       CONSTRAINT FK_1 FOREIGN KEY (idT1) REFERENCES Table_1
    );

    Je peux avoir plusieurs enregistrements dans la Table_2 ayant le même idT1.

    Supposons que j'ai le set de données suivant:


    Table_1
    idT1; nom; prénom
    001; Gates; Bill

    Table_2
    idT1; typeTel; numTel
    001; GSM; 00123456794650
    001; FIXE; 00132465797407
    001; FAX; 00023246406540


    J'aimerai faire un Select qui renvoi un résultat comme ceci (tout dans un seul enregistrement):
    ____________
    001; Gates; Bill; GSM - 00123456794650
    FIXE - 00132465797407
    FAX - 00023246406540
    ____________


    Concaténer directement deux colonnes et en même temps récupérer toute l'information de Table_2 dans un seul enregistrement. Je sais le faire en passant par des procédure stockée mais je crois que c'est possible avec BULK COLLECT mais je vois pas du tout comment cette option fonctionne.


    Merci d'avance pour votre aide.

  2. #2
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2008
    Messages : 21
    Points : 9
    Points
    9
    Par défaut
    J'ai mal expliqué ?

  4. #4
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Non, c'est plutôt rows into column

    Y'a eu pas mal de sujets là dessus.
    Recherche pivot ou ligne en colonne
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2008
    Messages : 21
    Points : 9
    Points
    9
    Par défaut
    C'est ni rows into column ni columns into rows que je veux faire.

    Je veux faire une concaténation de plusieurs colonnes et de plusieurs enregistrements enfants pour un seul enregistrement parent.

    J'ai déjà cherché Google mais j'ai rien trouvé.


    Bonsoir à vous

  6. #6
    Rédacteur

    Homme Profil pro
    Développeur et DBA Oracle
    Inscrit en
    Octobre 2006
    Messages
    878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur et DBA Oracle

    Informations forums :
    Inscription : Octobre 2006
    Messages : 878
    Points : 1 197
    Points
    1 197
    Par défaut
    Salut,

    Quelle est ta version ????

    Si tu as la version 10g, tu trouveras ci-dessous une solution avec model.

    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    IDT1,NOM ,PRENOM , SUBSTR(STRING ,4)
    FROM ( SELECT T1.IDT1,T1.NOM,T1.PRENOM, T2.TYPETEL, T2.NUMTEL  , 
                  ROW_NUMBER() OVER (PARTITION BY T1.IDT1,T1.NOM, T1.PRENOM ORDER BY  T2.TYPETEL DESC ) N 
    	   FROM TABLE_1 T1,TABLE_2 T2
           WHERE T1.IDT1=T2.IDT1
         ) T
    MODEL
    RETURN UPDATED ROWS
    PARTITION BY ( IDT1,NOM, PRENOM )
    DIMENSION BY ( N AS POSITION )
    MEASURES ( CAST( TYPETEL||','||NUMTEL AS VARCHAR2(4000) ) AS STRING)
    RULES
    UPSERT
    ITERATE( 100 )
    UNTIL ( PRESENTV(STRING[ITERATION_NUMBER+2],1,0) = 0 )
    ( STRING[0] =  STRING[0] || ' - ' ||STRING[ITERATION_NUMBER+1] )
    Le résultat
    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
     
    SQL> /
     
    IDT1  NOM
    ----- --------------------------------------------------
    PRENOM
    --------------------------------------------------
    STRING
    --------------------------------------------------------------------------------
    001   Gates
    Bill
    HHH,00213888888888 - GSM,00123456794650 - FIXE,00132465797407 - FAX,000232464065
    40
     
    002   CHELABI
    SALIM
     
    IDT1  NOM
    ----- --------------------------------------------------
    PRENOM
    --------------------------------------------------
    STRING
    --------------------------------------------------------------------------------
    GSM,00213999999999 - FIXE,00213215625230 - FAX,00213555555555

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2008
    Messages : 21
    Points : 9
    Points
    9
    Par défaut
    Merci pour ta réponse mais je comprend rien à ta requete.

    Je vais essayer de la découvrir partie par partie.

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    178
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 178
    Points : 220
    Points
    220
    Par défaut
    Une solution que je trouve plus claire mais qui demande un type tableau et une procéduree stockée :

    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
    CREATE OR REPLACE TYPE VARCHAR2_TABLE AS TABLE OF VARCHAR2(4000);
     
    CREATE OR REPLACE FUNCTION TableToString(
        strtblTable IN VARCHAR2_TABLE,
        strSeparator IN VARCHAR2 DEFAULT ',') RETURN VARCHAR2 AS
     
    strResult VARCHAR2(4000);
     
    BEGIN
     
        FOR i IN 1..strtblTable.COUNT LOOP
            IF (i = 1) THEN
                strResult := strtblTable(i);
            ELSE
                strResult := strResult||strSeparator||strtblTable(i);
            END IF;
        END LOOP;
     
        RETURN strResult;
     
    END TableToString;
    /
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT T1.IdT1, 
        T1.Nom,
        T1.Prenom,
        TableToString(CAST(COLLECT(T2.Typetel||' - '||T2.Numtel ORDER BY T2.Typetel) AS VARCHAR2_TABLE)) NumerosTelephone
    FROM Table_1 T1,
        Table_2 T2
    WHERE T2.IdT1 = T1.IdT1
    GROUP BY T1.IdT1, 
        T1.Nom,
        T1.Prenom;
    C'est ce type de solution que j'utilise personnellement pour répondre à ce type de problème. Le type VARCHAR2_TABLE est créé une fois pour toutes et la procédure est dans un package avec d'autres procédures du même ordre.

    A noter que la taille des éléments du tableau est volontairement limitée à 4000 (limite SQL d'un champ VARCHAR2) pour qu'il puisse être manipulé sans problème dans les requêtes SQL, voire éventuellement stocké en table, dans des files de message par exemple...

  9. #9
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Citation Envoyé par central.jaco Voir le message
    C'est ni rows into column ni columns into rows que je veux faire.

    Je veux faire une concaténation de plusieurs colonnes et de plusieurs enregistrements enfants pour un seul enregistrement parent.

    ...
    MCM a raison je me suis trompé.

    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
     
    SQL> r
      1  With T1 As
      2  (
      3    Select '001' id, 'Gates' nom,  'Bill' prenom From dual
      4  ),
      5  T2 As
      6  (
      7    Select '001' id, 'GSM' typeTel,  '00123456794650' numTel From dual Union ALL
      8    Select '001' id, 'FIXE' typeTel, '00132465797407' numTel From dual Union ALL
      9    Select '001' id, 'FAX' typeTel,  '00023246406540' numTel From dual
     10  )
     11  Select t1.id||';'||nom||';'||prenom||';'||Stragg(typetel||'-'||numtel)
     12    From T1, T2
     13   Where t1.id = t2.id
     14*  Group By t1.id||';'||nom||';'||prenom||';'
     
    T1.ID||';'||NOM||';'||PRENOM||';'||STRAGG(TYPETEL||'-'||NUMTEL)
    --------------------------------------------------------------------------------
    001;Gates;Bill;GSM-00123456794650,FIXE-00132465797407,FAX-00023246406540

Discussions similaires

  1. [SELECT] Faire un select avec des champs vides
    Par MinsK dans le forum Langage SQL
    Réponses: 1
    Dernier message: 09/08/2005, 00h05
  2. Faire un select sur une quantité défini d'élément
    Par tripper.dim dans le forum Requêtes
    Réponses: 2
    Dernier message: 21/06/2005, 11h14
  3. Faire un Select v1 sans mettre v1 dans Group By
    Par faayy dans le forum Langage SQL
    Réponses: 6
    Dernier message: 12/05/2005, 09h28
  4. Select particulier .
    Par hamed dans le forum Langage SQL
    Réponses: 9
    Dernier message: 17/11/2003, 15h45
  5. faire un selection dans une image aves les APIs
    Par merahyazid dans le forum C++Builder
    Réponses: 3
    Dernier message: 30/04/2002, 10h44

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