Oracle SQL : requête de concaténation

Bonjour,

Je bloque totalement sur une requête. J'ai eu beau fouiller les tutoriaux et chercher un peu partout je n'arrive pas à trouver la solution, peut-être que c'est parce qu'elle crève les yeux ?

Voilà mon souci : pour simplifier disons que j'ai une table avec 2 champs, et ces 2 champs s'appellent Objet et TypeObjet

TypeObjet peut prendre 4 valeurs différentes : 292, 293, 294 et 295
Objet peut être associé à 1 type comme aux 4 à la fois

Cela nous donne une table comme ceci :

_______Objet________TypeObjet
_________1____________294
_________2____________295
_________2____________292
_________2____________294

J'ai besoin que ma requête me sorte le numéro de l'objet, la concaténation de tous les types associés à cet objet (classés dans l'ordre croissant et séparés par une virgule), et enfin le MIN de tous.

Ce qui donnerait ici :
1____________294____________294
2_________292,294,295_________292

J'espère que c'est clair, et que je ne me suis pas trompé en voulant trop simplifier...

7 réponses

  • Votes
  • Date
  • Date décroissante
  1. Bonjour Poubellator,

    J'aurais dans un premier temps fait un truc du genre :

    DECLARE
        CURSOR c IS 
            SELECT  DISTINCT(obj)
            FROM    dacar.objet ;
        
        r c%ROWTYPE ;
        M INTEGER ;
        chaine VARCHAR2(256) ;
    BEGIN
        FOR r IN c 
        LOOP     
            SELECT  MIN(type_obj)
            INTO    m
            FROM    dacar.objet
            WHERE   obj = r.obj ;
             
            chaine := '' ;     
            
            FOR r2 IN 
                (   SELECT  type_obj
                    FROM    dacar.objet
                    WHERE   obj = r.obj
                    ORDER BY    type_obj)
            LOOP
                chaine := chaine||r2.type_obj||',' ;
            END LOOP ;    
            chaine := SUBSTR(chaine,0,LENGTH(chaine)-1) ;
            DBMS_OUTPUT.put_line(r.obj||'--'||chaine||'--'||m) ;
        END LOOP ;
    END ;
    
    1. Euh, je viens de m'apercevoir que j'ai laissé le dbms_output alors que celui-ci ne me servait juste qu'à afficher le résultat obtenu...il peut donc être mis en commentaire
  2. Je ne connais pas trop Oracle mais je ne pense pas que ce soit possible.
    Il va falloir ecrire un petit programme
    1. Si, il te faut faire une sous requête SELECT à l'intérieur de ton premier SELECT. Mais j'imagine que tu as déjà trouver une solution depuis le temps...
      1. Nimal,

        pensez à la communauté, et décrivez votre solution en code SQL, ça peut servir :)

        DROE
        1. Hello Heremion,

          Joli ce petit bout de Procédure :)
          Effectivement, ce serait la seule solution fiable ( en faire une Fonction avec obj en param) et l'appeler via une requête SQL.

          DROE
          1. Oui, après bien sûr, il est possible d'en faire une petite procédure stockée et en avant :), à adapter aussi si besoin :)